将原型添加到 JavaScript 对象字面量

IT技术 javascript prototype object-literal
2021-02-05 22:48:05
STORE = {
   item : function() {
  }
};
STORE.item.prototype.add = function() { alert('test 123'); };
STORE.item.add();

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

STORE.item.prototype.add();
5个回答

原型对象旨在用于构造函数,基本上是将使用new 运算符调用以创建新对象实例的函数。

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

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

我们也可以像这样分配原型Object.create(prototype)更多信息在这里
2021-03-18 22:48:05
换句话说,只有使用构造函数(使用“new”关键字)创建的对象才能访问原型中定义的属性和函数。从示例中的问题开始,这将起作用: var storeItem = new STORE.item() storeItem.add();
2021-03-20 22:48:05

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

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


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


STORE.item.add();

当这在搜索链的意义上变得有value时?
2021-03-31 22:48:05

您可以使用 JSON revivers 在解析时将 JSON 转换为类对象。ECMAScript的5草案已经通过在所描述的JSON2齐磊方案http://JSON.org/js.html

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

可选的 reviver 参数是一个函数,它将在最终结果的每个级别为每个键和值调用。每个值都将替换为 reviver 函数的结果。这可用于将通用对象转换为伪类的实例,或将日期字符串转换为日期对象。

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;
});
很高兴知道这些信息。+1。使用 myJSONtext 和类型函数详细信息的更详细的示例会更好,但无论如何感谢您提供此信息!
2021-04-04 22:48:05

在撰写本文时,这可以通过使用该__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

希望有帮助。

使用这种方法向原型添加函数最终给我带来了一些意想不到的后果。它实际上搞砸了项目中的其他一些功能。我还不知道为什么,因为我只是将函数添加为对象的属性而不是原型。(我所做的一切都是针对对象文字,而不是构造函数。)
2021-03-14 22:48:05
STORE = {
   item : function() {
  }
};

此命令将创建一个 STORE 对象。你可以通过typeof STORE;. 它应该返回“对象”。如果你输入STORE.item;它返回'function ..'。

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

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

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

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