这两种原型继承的实现之间有什么区别,并考虑到我们正在使用2种不同的“原型”(仅在函数和内部原型上的prototype属性),以及这些实现在其原型链查找中有何不同? ?另外,第一个实现(使用prototype属性)是否依赖于我们对new
运算符的使用?
分配给函数的prototype
属性并使用new
运算符:
function foo() {}
foo.prototype.output = function(){
console.log('inherits from Function.prototype property');
};
bar = new foo();
bar.output();
在对象文字中存储函数并使用Object.create()
方法:
var foo = {
output: function(){
console.log('inherits from the internal prototype');
}
};
var bar = Object.create(foo);
bar.output();
主要区别在于使用方式以及相关的危险。
第一个强制您new
在要创建新对象时使用。语法相当丑陋(SomeConstructor.prototype.method
),它有一个主要缺陷:调用一个this.name = nameParam
不带属性(...)new
的构造函数,将构造应用于全局对象。构造函数的行为很奇怪(创建委托给的新对象SomeConstructor.prototype
,然后将构造函数应用于新对象,然后,如果构造函数返回某些内容,则将该对象替换为something)。另外,在您的示例中,foo
它本身不可用,您必须创建一个新对象才能访问其功能。
第二个Object.create
不强迫您使用任何协同毒性的怪癖。您没有全球污染风险。该对象foo
具有可以在不创建新对象的情况下使用的功能,并且bar
将简单地借用这些功能。如果需要,这种模式还可以使工厂(无需new
在任何地方替换s)和对象池的实现更加容易。
埃里克·埃利奥特(Eric Eliott)讲得很好,而凯尔·辛普森(Kyle Simpson)写了一整本关于原型授权的书!
现在,这是查找的过程:
Constructor.prototype
(不是构造函数的实际内部原型,而是它的prototype
属性。如果您发现它令人困惑,那么恭喜,您是人类。)在构造函数中设置其他属性。foo
本身不用于查找,foo.prototype
(再次,与foo.__proto__
指向Function的指向不同)是用于查找的对象。Object.create
查找的对象本身上进行(foo
)。prototype
该对象上没有非原型属性。凯尔·辛普森(Kyle Simpson)的书的这一页上有非常有趣的图表,它们进一步解释了这一问题。
有关new
此问题的更多信息:JavaScript的“ new”关键字是否有害?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句