Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-动态原型模式+;寄生组合遗传_Javascript_Oop_Inheritance_Design Patterns - Fatal编程技术网

JavaScript-动态原型模式+;寄生组合遗传

JavaScript-动态原型模式+;寄生组合遗传,javascript,oop,inheritance,design-patterns,Javascript,Oop,Inheritance,Design Patterns,我正在为Web开发人员使用专业JavaScript,对对象创建和继承有疑问。在本书中,动态原型模式被讨论为一种很好的组合构造函数/原型模式的方法,同时将构造函数和原型封装到对象定义中。像这样: function Person(name, age, job) { this.name = name; this.age = age; this.job = job; if (typeof this.sayName != "function") { Person.prototyp

我正在为Web开发人员使用专业JavaScript,对对象创建和继承有疑问。在本书中,动态原型模式被讨论为一种很好的组合构造函数/原型模式的方法,同时将构造函数和原型封装到对象定义中。像这样:

function Person(name, age, job) {
  this.name = name;
  this.age = age;
  this.job = job;

  if (typeof this.sayName != "function") {
    Person.prototype.sayName = function () {
      return this.name;
    };
  }
}
在书中讨论的所有对象创建模式中,我觉得这一个看起来最好。然后在讨论继承时,书中说寄生组合继承被认为是最佳的继承范例。详情如下:

function inheritPrototype(subType, superType) {
  var prototype = Object.create(superType.prototype);
  prototype.constructor = subType;
  subType.prototype = prototype;
}

function SuperType(name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

SuperType.prototype.sayName = function() {
  return this.name;
};

function SubType(name, age) {
  SuperType.call(this, name);
  this.age = age;
}

inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function() {
  return this.age;
}
如您所见,此代码使用组合构造函数/原型模式来创建对象,其中原型在原始对象创建之外声明。我的问题是,将动态原型模式与寄生组合继承相结合是否存在任何问题,例如:

function inheritPrototype(subType, superType){
  var prototype = Object.create(superType.prototype);
  prototype.constructor = subType;
  subType.prototype = prototype;
}

function SuperType(name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];

  if (typeof this.sayName != "function") {
    SuperType.prototype.sayName = function() {
        return this.name;
    };
  }
}

function SubType(name, age) {
  SuperType.call(this, name);
  this.age = age;

  if (typeof this.sayAge != "function") {
    SubType.prototype.sayAge = function() {
        return this.age;
    };
  }
}

inheritPrototype(SubType, SuperType);
我已经在一个JSFIDLE中对此进行了测试,它似乎工作得很好,我只是想确保没有遗漏什么东西会在以后使用此模式/继承时导致问题

另外,据我所知,这本书有点老,是否有新的对象创建和继承标准?

这两种方法似乎都被打破了

即使尚未调用构造函数,给定的对象原型属性也应该可用。另一方面,这似乎打破了单一责任原则,因为构造函数负责定义原型,而它应该初始化正在构造的对象

只有一个问题:在构建基础对象之前,如何继承给定对象的原型?

var B = Object.create(A.prototype);
等等
A.prototype
不会包含预期的属性,除非之前有一些代码调用了
newa()

// Ugly as hell!
new A();
var B = Object.create(A.prototype);
总之,不要尝试简化JavaScript:最好学习它,不要尝试用无用/无意义的函数包装继承

实际上,ECMA Script 6及以上标准已经定义了语法糖,使JavaScript原型链看起来像经典继承:

class B extends A 
{
}
…这绝对等同于:

function B() {}
B.prototype = Object.create(A.prototype);
这两种方法似乎都失败了

即使尚未调用构造函数,给定的对象原型属性也应该可用。另一方面,这似乎打破了单一责任原则,因为构造函数负责定义原型,而它应该初始化正在构造的对象

只有一个问题:在构建基础对象之前,如何继承给定对象的原型?

var B = Object.create(A.prototype);
等等
A.prototype
不会包含预期的属性,除非之前有一些代码调用了
newa()

// Ugly as hell!
new A();
var B = Object.create(A.prototype);
总之,不要尝试简化JavaScript:最好学习它,不要尝试用无用/无意义的函数包装继承

实际上,ECMA Script 6及以上标准已经定义了语法糖,使JavaScript原型链看起来像经典继承:

class B extends A 
{
}
…这绝对等同于:

function B() {}
B.prototype = Object.create(A.prototype);

inheritPrototype
需要使用
对象。create
而不是
对象
我不得不说,“动态原型模式”在我看来非常难看……而且原型方法应该是静态的,而不是动态的,所以有人可能会认为在构造函数中创建它们(即使只是动态的)是一种糟糕的做法。如果你寻找语法封装,不如使用IILIE围绕构造函数+继承+原型,或者只使用ES6类。
inheritPrototype
需要使用
Object。create
而不是
Object
我不得不说,“动态原型模式”在我看来很难看……原型方法也应该是静态的,不是动态的,因此有人可能会认为在构造函数中创建它们(即使只是动态创建)是一种糟糕的做法。如果您寻找语法封装,那么应该使用构造函数+继承+原型的IIFE,或者只使用ES6类。