假设我们创建一个名为“Shape”的函数,并在其原型上添加属性“name”和方法“toString”:
var Shape = function () {};
Shape.prototype.name = 'Shape';
Shape.prototype.toString = function () {
return this.name;
}
console.log(Shape.name); // ''
console.log(Shape.toString()); // function () {}
var Triangle = new Shape();
console.log(Triangle.name); // 'Shape'
console.log(Triangle.toString()); // 'Shape'
“NEW”操作员做了两件事:
1. 它将 this 指向“三角形”
2. 将 'Triangle's [[proto]] 指向 Shape.prototype
然后我就可以理解,当我在 Triangle 上调用 name & toString 时,它会搜索它的原型链,直到 Shape.prototype。
但我的问题是为什么 Shape 不搜索它的属性(即使它是一个对象)的方法和属性?
Thanks.
当您访问对象上的属性时,Javascript 首先直接在对象上查找已直接添加到该对象的任何属性(这些属性称为“自己的”属性)。如果它在那里找不到属性,那么它会查找原型链。
所以,当你这样做时:
var Triangle = new Shape();
console.log(Triangle.toString()); // 'Shape'
它寻找.toString()
名为 Triangle 的实际对象上的属性,但该对象上没有直接使用该名称的属性。因此,由于它没有直接在对象上找到任何内容,因此它会在原型上查找并找到Shape.prototype.toString()
执行在那里,这就是执行的内容。
创建 Triangle 对象时,对原型的引用存储在该对象上。它不存储在.prototype
property - 该属性仅在构造函数中使用。相反,每个 JS 版本都有自己的存储原型引用的方式,并且传统上所有浏览器的存储方式都不相同,而且存储方式也是非标准的。它最初仅供 JS 引擎内部使用。例如,Chrome 将其存储在名为obj.__proto__
,但 IE 没有。为了解决标准化的缺乏,有一种新方法称为obj.getPrototypeOf()
现在可以在现代浏览器中使用它来访问给定对象的原型。无论如何,JS 引擎在解析在实际对象本身上找不到的属性名称时,都会自动为您搜索此原型。
如果你这样做:
var Triangle = new Shape();
Triangle.toString = function() {
return 'Shape named Triangle';
}
console.log(Triangle.toString()); // 'Shape named Triangle'
然后,javascript首先会找到toString()
您直接附加到对象的实现,它将执行该实现而不是原型上的实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)