快速背景:在JavaScript中,每种对象类型的构造函数都有一个prototype
属性。的prototype
是指一个对象,各构造对象的用途如在其原型链中的下一步骤的。当您希望一种类型可以是另一种类型固有的类型时,可以将prototype
子类型的设置为父类型的新实例。
例如:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
我的问题询问上面的代码中应在“ Some prototype object goes here
”位置添加哪些代码。我的第一个本能是构造父对象的实例(即new Parent()
),但在评论“关于将这样的对象原型复制到另一个对象的安全方法吗?”的评论中。,一位用户写道:
不,请勿
new bar()
用于原型对象!
(...这是我在许多答案和评论中都看到的一种观点,但这是我目前手头唯一的例子。)
另一种选择是Object.create(Parent.prototype)
用作Child.prototype
。据我所知,这还会创建一个新Parent
实例,但不会运行Parent
构造函数。
有人可以解释为什么从父类型生成原型对象时应避免运行构造函数的原因吗?是否会出现一些重大的技术问题(也许具有多个继承级别)?还是这种模式会误用构造函数,从而与一些典型的最佳实践相冲突(例如,在创建原型时运行构造函数违反了某些关注点分离)?
Object.create
实现的方式。