JavaScript原型:为什么这个不起作用?

3
我将尝试以下代码:

我正在尝试以下代码:

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

为什么警告返回为未定义?JavaScript不应该遵循原型链以找到z吗?

https://dev59.com/R3RC5IYBdhLWcg3wMd9S - Eineki
4个回答

3

我不相信你可以更改一个原型的原型,或者这种事情是否存在。相反,可以尝试以下方法:

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

3
默认情况下,一个对象原型(object prototype)是一个空对象。
classA.prototype = { x: 4, y: 6 };
classA.prototype.prototype = { z: 10 };

等同于

classA.prototype = { x: 4, y: 6, prototype: { z: 10 }};

你刚刚给 classA 添加了一个名为 prototype 的属性

z 是属于 classAprototype 对象的属性

alert(foo.prototype.z); 将会起作用


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);

2
除了__proto__是非标准的之外 - Justin Johnson

1

原型属性可以在所有函数中免费使用 - 如果该函数旨在用作构造函数(它定义了分配给由该构造函数创建的实例的原型)。

您正在尝试将原型属性分配给非函数 - 这是没有意义的。在某些浏览器中,对象的原型可以通过非标准的 proto 属性获取和设置。

还有一种新的 ECMA 标准 API,用于访问对象的原型。

Object.getPrototypeOf(obj)

但它还不被所有浏览器支持

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接