需要JavaScript面向对象编程的帮助

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

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

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

我遇到了这个错误TypeError: Cannot set property 'test' of undefined,但我无法解决它。

据我理解,b是从Object继承原型对象的。因此,我们应该能够通过以下方式添加一个新属性,比如说 b.prototype.x = 1。

但是 Object.prototype.x = 1 就可以起作用。

typeof Object 和a返回函数,但b返回对象。

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

谢谢。

4个回答

2

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

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


如果你想设置一个对象的原型,你可能指的是设置该对象构造函数的原型。

b.constructor.prototype.test = ...

为了澄清一些原型/构造函数的混淆:

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

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

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


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 - 这会导致第一个函数起作用。

第一个函数不起作用是因为它继承了Object(),还是我理解有误? - ryuusenshi
第二个不起作用是因为此时b没有外部原型字段。我认为你对第一个能够工作的观点是正确的,因为新创建的函数会将Object设置为其外部原型字段。 - bchurchill

1

您可以参考这个 资源

它无法适用于新对象,因为它没有设置prototype属性。 prototype属性指向您继承的对象。 由于new Object()没有要继承的对象,因此其prototype设置为undefined

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


0
你应该可以这样做:
var b = {};
b.test = function() {
    alert('Hello');
};

你还没有回答为什么它不能按照OP的方式工作。 - Paul Fleming

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