这是一个对象:
var obj = new function(){
this.prop = {};
}
我尝试做类似的事情:
obj.prop.prototype["new_attr"] = "some_value";
我想做的是永久修改obj.prop
以包含新属性。根据我的理解,所有“对象”都有原型,但JavaScript告诉我prop
没有原型。
也许我采取了错误的方法(尝试永久修改prop
),但我至少想知道为什么上面的代码不起作用。
答案 0 :(得分:6)
通常,您可以从构造函数访问prototype
对象,但也可以从对象获取它,但不能使用.prototype
。
获取对象的原型对象的非官方方式(在所有浏览器中不支持)具有__proto__
属性。 (我相信它在支持(编辑)它的浏览器中已被弃用。)
获取对象的原型对象的官方ECMAScript 5方式(在所有浏览器中也不支持)是使用Object.getPrototypeOf()
。
在你的情况下.prop
引用了一个对象文字,所以你已经知道原型是Object.prototype
。
Object.getPrototypeOf( {} ) === Object.prototype; // true
请注意,扩展Object.prototype
几乎总是一个坏主意。
“也许我采取了错误的方法(试图永久修改道具),但我至少想知道为什么上面的代码不起作用。”
如果您只是想修改.prop
引用的对象,那么只需执行:
obj.prop.new_attr = "some_value";
答案 1 :(得分:1)
您可以完成您要执行的操作,但需要将prop对象添加到构造函数原型中:
var Obj = function() {};
Obj.prototype.prop = { bar: 'bar value' };
var obj_1 = new Obj();
console.log(obj_1.prop.bar); //bar value
obj_1.prop.foo = 'foo value';
var obj_2 = new Obj();
console.log(obj_2.prop.foo); //foo value
答案 2 :(得分:0)
因为prop属性为空。在您能够修改object.prop之前,您需要先将prop初始化为默认值。
请参阅以下参考资料:Extending JavaScript Objects and Classes
Introduction to Object-Oriented JavaScript {
{3}}
HTH。欢呼声。