向JavaScript对象文字添加原型

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

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

 STORE.item.prototype.add(); 

原型对象意味着在构造函数上使用 ,基本函数将使用new运算符来调用以创build新的对象实例。

JavaScript中的函数是第一类对象,这意味着您可以将成员添加到对象中,并像普通对象一样对待它们:

 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的所有实例都将inheritanceSomeObject.prototype中的成员,因为这些成员将通过原型链访问。

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

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

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

您可以使用JSON revivers在parsing时将您的JSON转换为类对象。 EcmaScript 5草案采用了http://JSON.org/js.html中描述的JSON2 reviverscheme

 var myObject = JSON.parse(myJSONtext, reviver); 

可选的reviver参数是一个函数,将在最终结果的每个级别为每个键和值调用。 每个值将被reviver函数的结果replace。 这可以用来将通用对象改造为伪类的实例,或者将datestring转换为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; }); 

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

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

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

 const pug = Object.create(dog) pug.bark(); 

或者您也可以使用Object.setPrototypeOf,如其中一个答案中所述。

希望有所帮助。