需要帮助javascript oops

时间:2012-07-28 19:30:17

标签: javascript oop object prototype

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

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

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

我收到此错误TypeError:无法设置undefined的属性'test',我无法得到它。

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

对象 .prototype.x = 1有效。

typeof 对象和一个给定函数,但b的对象是

我不知道为什么b.prototype.x = 1无法正常工作

感谢。

4 个答案:

答案 0 :(得分:2)

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

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


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

b.constructor.prototype.test = ...

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

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

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

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

答案 1 :(得分: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 - 这会导致第一个工作。

答案 2 :(得分:1)

您可以参考此resource

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

另一方面,function默认具有超级对象(它继承)。

答案 3 :(得分:0)

你应该能够这样做:

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