我正在尝试以下代码:
var classA = function() {};
classA.prototype = { x: 4, y: 6 };
classA.prototype.prototype = { z: 10 };
var foo = new classA();
alert(foo.z);
为什么警报会以未定义的形式返回?不应该跟着原型链javascript找到z?
答案 0 :(得分:3)
我不相信你可以改变原型的原型或者甚至存在这样的东西。这样做
var classA = function() {};
classA.prototype = { x: 4, y: 6 };
classA.prototype.z = 10;
var foo = new classA();
alert(foo.z);
答案 1 :(得分:3)
默认情况下,object prototype
是一个空对象。
classA.prototype = { x: 4, y: 6 };
classA.prototype.prototype = { z: 10 };
相当于
classA.prototype = { x: 4, y: 6, prototype: { z: 10 }};
您刚刚向prototype
classA
的媒体资源
z
是属于prototype
classA
的属性
alert(foo.prototype.z);
将有效
答案 2 :(得分:1)
对象的原型存储在__proto__
中。类的prototype
属性实际上是其实例的默认原型。我发现this article非常有用。
如果您将代码更改为使用__proto__
作为原型的原型,它将按预期运行。
var classA = function() {};
classA.prototype = { x: 4, y: 6 };
classA.prototype.__proto__ = { z: 10 };
var foo = new classA();
alert(foo.z);
答案 3 :(得分:1)
原型属性在所有函数上都是免费的 - 如果该函数旨在用作构造函数(它定义了要分配给该构造函数创建的实例的原型)。
您正在尝试将原型属性分配给非功能 - 这是毫无意义的。在某些浏览器中,对象的原型可以通过非标准的 proto 属性来获取和设置。
还有一个新的ECMA标准API用于访问对象的原型
Object.getPrototypeOf(obj)
但所有浏览器尚不支持
编辑:刚才意识到我是奥斯汀链接的作者: - )