2012-07-28 63 views
4
var a = function() {}; 
a.prototype.test = function() { 
alert("hello"); 
} 

工作正常,但在下面的代码需要帮助的JavaScript哎呀

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

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

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

但是对象 .prototype.x = 1作品。

的typeof 对象和赋予功能但乙的是反对

我没有得到为什么b.prototype.x = 1个不起作用

感谢。

回答

2

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

new Object()创建一个对象,该对象不具有prototype属性。


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

b.constructor.prototype.test = ... 

为了澄清一些原型/构造无义的:

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

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

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

0

你应该能够做到这一点是这样的:

var b = {}; 
b.test = function() { 
    alert('Hello'); 
}; 
+0

你还没有回答,为什么它不工作的OP有它的方式的问题。 – 2012-07-28 19:49:55

1

您可以参考这个resource

它不会为新对象的工作,因为它不具有prototype属性集。 prototype属性指向您已继承的对象。而且,由于new Object()一直没有对象从继承,其prototype设置为undefined

一个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中。

我不知道为什么,但新创建的功能得到他们的外部原型字段设置为对象 - 这将导致第一个工作。

+0

没有第一个工作,因为一个函数继承了Object(),还是我误解了一些东西? – ryuusenshi 2012-07-28 20:10:03

+0

第二个不起作用,因为b在该点上没有外部原型字段。我认为你对第一个工作是正确的,因为新创建的函数将Object设置为其外部原型字段。 – bchurchill 2012-07-28 20:11:37

+0

好吧,+1,一个非常好的解释 – ryuusenshi 2012-07-28 20:12:53