【问题标题】:Add Function to JavaScript Object using Object.Create使用 Object.Create 向 JavaScript 对象添加函数
【发布时间】:2012-11-13 22:58:39
【问题描述】:

我正在尝试在 JavaScript 中使用 Object.Create。我目前有以下代码:

var vehicle = {
        getModel: function () {
        console.log( "The model of this vehicle is.." + this.model );
    }
};

var car = Object.create(vehicle, {
    "id": {
       value: 9,         
    },
    "model": {
       value: "Ford",  
    }
});

var van = Object.create(vehicle, {
  "id": {
     value: 10,    
   },
    "model": {
      value: "Big Van",
      enumerable: true
   },
    "make": {
      value: "Warrior",      
   },
    "getMake": function () {
       console.log( "The make of this vehicle is.." + this.make );
   }
});

我尝试向 van 中添加 getMake 函数,但出现错误:

TypeError:当我调用时,对象# 的属性“getMake”不是函数:

van.getMake();

这可能吗?你是怎么做到的?

【问题讨论】:

  • 我没用过Object.create...
  • 不仅没用过,甚至不知道它的存在……

标签: javascript oop object-create


【解决方案1】:

默认情况下,以这种方式创建的属性不可枚举。这可能会导致您的问题。

试试这个(未经测试):

"getMake": { value: function () {
       console.log( "The make of this vehicle is.." + this.make )
   }, enumerable: true };

编辑 看起来这是可行的,因为我们传递的是一个对象而不仅仅是值。可枚举是不必要的。

【讨论】:

  • 属性不需要是可枚举的。
  • 我支持@dystroy,我什至认为该属性最好定义为enumerable: false,在迭代对象(for (var p in obj))时,您通常不想处理方法
  • 但是默认行为是列出所有可枚举的属性,并且方法默认是可枚举的。所以最好使用 enumerable:true ,因为它更接近预期的默认行为。
【解决方案2】:

您需要传递一个定义属性的对象,而不仅仅是值:

 "getMake": {value:function () {
     console.log( "The make of this vehicle is.." + this.make );
 }}

Reference

请注意,在 Javascript 中执行 OOP 的常用方法不是使用 Object.create,而是使用 prototype

【讨论】:

  • 在我个人看来,它丑陋、无用,而且 slow。但是,作为大多数 js 编码人员,我从不使用 Object.create,所以我可能会错过它的一些优点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 2023-04-08
  • 2011-11-09
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多