javascript原型设计:为什么这不起作用?

时间:2011-04-26 17:38:14

标签: javascript

我正在尝试以下代码:

var classA = function() {};
classA.prototype = { x: 4, y: 6 };
classA.prototype.prototype = { z: 10 };
var foo = new classA();
alert(foo.z);

为什么警报会以未定义的形式返回?不应该跟着原型链javascript找到z?

4 个答案:

答案 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)

但所有浏览器尚不支持

编辑:刚才意识到我是奥斯汀链接的作者: - )