【问题标题】:JavaScript: modify prototype of an object's variable?JavaScript:修改对象变量的原型?
【发布时间】:2011-09-13 03:12:01
【问题描述】:

这是一个对象:

var obj = new function(){
    this.prop = {};
}

我尝试做类似的事情:
obj.prop.prototype["new_attr"] = "some_value";

我想做的是永久修改obj.prop 以包含新属性。据我了解,所有“对象”都有原型,但 JavaScript 告诉我 prop 没有原型。

也许我采取了错误的方法(试图永久修改prop),但我至少想知道为什么上面的代码不起作用。

【问题讨论】:

    标签: javascript object prototype-programming


    【解决方案1】:

    通常您从构造函数访问prototype 对象,但您也可以从对象中获取它,但不能使用.prototype

    获取对象原型对象的非官方方式(并非所有浏览器都支持)是使用__proto__ 属性。 (我相信它在支持它的浏览器中已被弃用)。

    官方的ECMAScript 5方式(并非所有浏览器都支持)获取对象的原型对象是使用Object.getPrototypeOf()

    在您的情况下,.prop 引用了一个对象字面量,因此您已经知道原型是 Object.prototype

    Object.getPrototypeOf( {} ) === Object.prototype;  // true
    

    请注意,扩展Object.prototype 几乎总是一个坏主意。


    “也许我采取了错误的方法(试图永久修改 prop),但我至少想知道为什么上面的代码不起作用。”

    如果您只是想修改.prop 引用的对象,那么只需这样做:

    obj.prop.new_attr = "some_value";
    

    【讨论】:

      【解决方案2】:

      您可以完成您正在尝试做的事情,但您需要将 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
      

      【讨论】:

        【解决方案3】:

        因为 prop 属性为空。在修改 object.prop 之前,您需要先将 prop 初始化为默认值。

        请参阅以下参考资料:Extending JavaScript Objects and Classes
        Introduction to Object-Oriented JavaScript
        A re-introduction to JavaScript

        HTH。干杯。

        【讨论】:

          猜你喜欢
          • 2020-04-24
          • 1970-01-01
          • 1970-01-01
          • 2023-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          相关资源
          最近更新 更多