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无法正常工作
感谢。
答案 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');
};