将原型添加到JavaScript Object Literal

时间:2009-10-20 04:09:02

标签: javascript prototype object-literal

STORE = {
   item : function() {
  }
};
STORE.item.prototype.add = function() { alert('test 123'); };
STORE.item.add();

我一直试图弄清楚这有什么问题。为什么这不起作用?但是,当我使用以下内容时它会起作用:

STORE.item.prototype.add();

5 个答案:

答案 0 :(得分:79)

原型对象用于constructor functions,基本上是使用new operator调用的函数来创建新的对象实例。

JavaScript中的函数是first-class个对象,这意味着您可以向它们添加成员并将它们视为普通对象:

var STORE = {
   item : function() {
  }
};

STORE.item.add = function() { alert('test 123'); };
STORE.item.add();

如前所述,原型对象的典型用法是通过使用new运算符调用构造函数来实例化对象,例如:

function SomeObject() {} // a constructor function
SomeObject.prototype.someMethod = function () {};

var obj = new SomeObject();

SomeObject的所有实例都将继承SomeObject.prototype中的成员,因为这些成员将通过原型链进行访问。

JavaScript中的每个函数都有一个原型对象,因为无法知道哪些函数可以用作构造函数。

答案 1 :(得分:12)

多年后,当JavaScript(ES2015到达)时,我们终于有了Object.setPrototypeOf()方法

const STORE = {
  item: function() {}
};


Object.setPrototypeOf(STORE.item, {
  add: function() {
    alert('test 123');
  }
})


STORE.item.add();

答案 2 :(得分:2)

您可以使用JSON revivers在分析时将JSON转换为类对象。 EcmaScript 5草案采用了http://JSON.org/js.html

中描述的JSON2 reviver方案
var myObject = JSON.parse(myJSONtext, reviver);
  

可选的reviver参数是a   将为每个人调用的函数   每个级别的关键和价值   最后结果。每个值都是   取而代之的是复活的结果   功能。这可以用来改革   将通用对象转换为实例   伪类,或转换日期   字符串到Date对象。

myData = JSON.parse(text, function (key, value) {
    var type;
    if (value && typeof value === 'object') {
        type = value.type;
        if (typeof type === 'string' && typeof window[type] === 'function') {
            return new (window[type])(value);
        }
    }
    return value;
});

答案 3 :(得分:2)

在撰写本文时,可以使用__proto__属性。以防万一这里有人正在检查,可能在将来。

const dog = {
    name: 'canine',
    bark: function() {
        console.log('woof woof!')
    }
}

const pug = {}
pug.__proto__ = dog;

pug.bark();

但是,在这种情况下添加原型的推荐方法是使用Object.create。所以上面的代码将被翻译成:

const pug = Object.create(dog)

pug.bark();

或者您也可以使用其中一个答案中提到的Object.setPrototypeOf

希望有所帮助。

答案 4 :(得分:0)

STORE = {
   item : function() {
  }
};

此命令将创建一个STORE对象。您可以通过typeof STORE;进行检查。它应该返回“对象”。而且,如果您输入STORE.item;,它将返回'function ..'。

由于它是一个普通对象,因此如果要更改项目功能,则可以使用此命令访问其属性/方法。

STORE.item = function() { alert('test 123'); };

尝试STORE.item;,它仍然应该返回'function ..'。

尝试STORE.item();,然后将显示警报。