javascript - 使用 Object.create() 的对象创建模式

标签 javascript inheritance prototype factory

我一直在研究如何在使用 Object.create() 而不是传统的构造函数时进行多级继承。我打开了一个 fiddle here .

我们有两类对象,程序员,和一个“子类”的前端开发人员。程序员继承自程序员原型(prototype)对象,正如你所看到的,所有的程序员都会很尴尬。

var programmerProto = Object.create(Object.prototype,{    
   beAwkward: {value: function(){
          return "Yeah I uhh, AHEM, *shuffles feet*";
   }
  }    
});

function programmerFactory (name, age, neckbeard){
  return Object.create(programmerProto, {
    name: {writable: true, enumerable: true, value: name},
    age: {writable: false, enumerable: true, value: age},
    neckbeard: {writable: true, enumerable: true, value: neckbeard}
  });
}

现在对于前端开发人员来说,他们有自己的共同特征,所以我们需要一个新的原型(prototype)对象来定义。但是,前端开发人员也是程序员,所以我们制作前端原型(prototype)对象如下:

 var frontEndProto = Object.create(programmerProto, {
   beSmooth: {
     value: function(){
                 return "Excuse me ma'am, could I interest you in a, fish sandwich?";
             }        
 },
   preferredLanguage: {writable: true, enumerable: true, value: 'JS'}
});

现在我们遇到了问题。我想使用工厂方法来创建前端开发人员的实例,这样我就可以添加一些前端特定的属性,例如“CSS3_skillz”之类的。但是如果我使用 Object.create(frontEndProto, "..."),那...将是我已经在 programmerFactoryFunction 中编写的所有代码。如果我从 frontEndFactory 中调用 programmerFactory,那么返回对象的原型(prototype)是 programmerProto 而不是 frontEndProto。处理这个问题的正确方法是什么?

最佳答案

我认为您在继承链和 Object.defineProperty() 样式属性的使用上有点过火了。

除非您有充分的理由需要像instanceof 这样的东西,否则您可以只使用.extend() 函数来实现您的继承。我在下面使用下划线/lodash _.extend() 函数,但您几乎可以使用它的任何实现:

var programmerProto = {    
    beAwkward: function(){
        return "Yeah I uhh, AHEM, *shuffles feet*";
    }
};

function programmerFactory (name, age, neckbeard){
    return _.extend({
        name: name,
        age: age,
        neckbeard: neckbeard
    }, programmerProto);
}

var frontEndProto = {
    beSmooth: function(){
        return "Excuse me ma'am, could I interest you in a, fish sandwich?";
    },
    preferredLanguage: 'JS'
};

function frontEndFactory(name, age, css3Skillz) {
    return _.extend(programmerFactory(name, age, true), {
        css3Skillz: css3Skills
    }, frontEndProto);
}

我觉得这个话题讲的不错:
http://www.youtube.com/watch?v=PV_cFx29Xz0&t=28m57s

关于javascript - 使用 Object.create() 的对象创建模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28471877/

相关文章:

php - websocket 与 mysql 的连接

javascript - D3js v5 尝试使用画笔在条形图中选择多个条并将值保存到变量和表

c++ - 在 C++ 中调用函数是不明确的。候选函数是原型(prototype)和函数本身

javascript - 为什么迭代中会出现原型(prototype)函数?

javascript - 将 HTML5/CSS3 行为引入旧浏览器 (IE) 的 Js 脚本分解

java - Toplink JPA 继承 - 摘要/详细关系

C++重载函数问题

django orm - 如何在其父类(super class)的子类的外键上使用 select_related()

C编程练习: Function Prototype

javascript - jQuery 选择全部而不是某些字段