我一直想弄清楚如何使用Object.create()而不是传统的构造方法来进行多级继承。我打开了一个小提琴 here

我们有两种类型的对象,即程序员和“子类”前端开发人员。程序员继承自程序员原型对象,并且您可以看到,所有程序员都可能很笨拙。

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}
  });
}


现在,对于前端开发人员而言,它们具有自己的共同特征,因此我们需要定义一个新的原型对象。但是,前端开发人员也是程序员,因此我们将前端原型对象制作如下:

 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,“ ...”),则...将是我已经在programmatorFactoryFunction中编写的所有代码。如果我从frontEndFactory内部调用programmerFactory,则返回对象的原型为programmerProto,而不是frontEndProto。处理此问题的正确方法是什么?

最佳答案

我认为您在继承链问题和Object.defineProperty()样式属性的使用上有些过分。

除非您有充分的理由需要instanceof之类的东西,否则只能使用.extend()函数来实现继承。我在下面使用underscore / 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/

10-12 12:22
查看更多