这两种原型继承方式有什么区别,哪一种更好用?
function Cat() {
this.__proto__.type = 'кот';
}
var cat = new Cat();
console.log(cat.type); // кот
function CatTwo() {
}
CatTwo.prototype.type = 'тоже кот';
var catTwo = new Cat();
console.log(catTwo.type); // тоже кот
实际上,问题的示例中没有继承。
__proto__
直到最近才标准化。在最新的规范中,您会发现getter
__proto__
是内部函数调用的包装器[[GetPrototypeOf]]
。与 Object.getPrototypeOf 函数完全一样
如果应用于上述代码:
在第一种情况下,每次创建对象时原型的值都会改变,在第二种情况下,它只设置一次。
由此我们可以得出结论,如果可以访问构造函数,最好直接从它更改原型。
上述代码将产生不同值的示例:
__proto__ 属性
绝对 JavaScript 中的任何对象都有一个proto属性。这是一个隐藏的系统属性,并非在所有语言实现中都可供用户使用。
当访问对象的任何属性时,首先在对象本身中查找:
但如果它不存在,则搜索发生在proto属性中:
如果它也不存在,则在链的下游进行搜索:
该链称为原型链。
任何值(除了 null 和 undefined)的proto指的是其对应数据类型的原型:
所有数据类型都继承自 Object,这意味着:
最后,链的末端:
原型属性
这是一个正常的属性,与任何其他属性没有什么不同。除了两件事:
该运算符执行以下操作:
创建一个空对象:
通过对类函数原型的引用将proto设置为该对象:
将类函数应用于我们新创建的对象:
返回类函数的一个实例,但是如果 FnClass 返回一个对象给我们,那么它:
我将类函数称为预期稍后将应用新运算符的函数。此类函数通常以大写字母命名。