4
var a = function () {};
a.prototype.test  = function () {
alert("hello");
} 

工作正常,但在以下代码中

var b = new Object();
b.prototype.test  = function () {
alert("hello");
} 

我收到此错误类型错误:无法设置未定义的属性“测试”,我无法获取它。

根据我的理解, b 已经从Object继承了原型对象。所以我们应该能够以下面的方式添加一个新属性,比如 b.prototype.x = 1 。

但是Object .prototype.x = 1 有效。

typeof Object和 a 给出函数,但 b 是对象

我不明白为什么 b.prototype.x = 1 不起作用

谢谢。

4

4 回答 4

2

Object是一个函数,它有一个prototype属性。

new Object()创建一个没有prototype属性的对象。


如果要设置对象的原型,可能意味着设置对象构造函数的原型。

b.constructor.prototype.test = ...

澄清一些原型/构造函数的废话:

一个函数有一个prototype,它是一个对象。它指定要添加到该函数实例的属性。

一个对象有一个constructor,它是一个函数。它指定用于创建对象的函数。

请注意,函数是一个对象,因此它也有一个constructor,即Function

于 2012-07-28T20:03:02.420 回答
2

这是一个棘手的问题——原型字段有两种类型,一种是内部的,一种是外部的。您可以使用普通原型字段直接访问的外部字段。内部的用于在对象中找不到字段/键时进行查找。

如果这样做new blah(),它会创建一个新对象,其内部原型字段设置为 的外部原型字段blah。默认情况下,新建对象的外部原型字段为undefined. 特别是,这就是评估 b.prototype.x 失败的原因——您不能对未定义的值进行字段访问。如果您希望可以为新的外部原型创建一个新对象,例如b = new Object(); b.prototype = {}.

您可以在此处查看内部/外部原型字段:

Object.prototype.x = 4
b = new Object()
b.x // returns 4

发生的事情是 b 的内部原型字段指向 Object.prototype,因此对失败的 b 的查找被重定向到在 Object.prototype 中进行查找。

我不知道为什么,但是新创建的函数将它们的外部原型字段设置为 Object——这导致第一个函数工作。

于 2012-07-28T20:07:59.377 回答
1

你可以参考这个资源

它不适用于新对象,因为它没有prototype属性集。prototype属性指向您继承的对象。并且由于new Object()没有可继承的对象,因此将其prototype设置为undefined

function另一方面,默认情况下有一个超级对象(它继承)。

于 2012-07-28T19:39:40.743 回答
0

你应该可以这样做:

var b = {};
b.test = function() {
    alert('Hello');
};
于 2012-07-28T19:34:11.830 回答