2

私はJavascriptで継承を学んでいます。具体的には、Professional JS for Web DevelopersからParasitic Combination Inheritanceです。SuperType を Subtype に継承するメソッドが 3 つあります 。それらはすべてまったく同じように動作します。なんで?彼らはすべきですか?私の腸は私が何かが欠けていることを教えてくれます

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

function myInheritPrototype(subType, superType) {
    subType.prototype = Object.create(superType.prototype); // inherit methods
    subType.prototype.constructor = subType; // assign constructor
}

function myInheritPrototype2(subType, superType) {
    subType.prototype = superType.prototype; // inherit methods
    subType.prototype.constructor = subType; // assign constructor
}

ヘルパー関数は次のとおりです。

function object(o) {
    function F() {};
    F.prototype = o;
    return new F();
}

上記の 3 つの inheritPrototype() 関数を使用するコードは次のとおりです。

function SuperType1(name) {
    this.name = name;
    this.colors = ["r", "g", "b"];
}

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

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

// method inheritance happens only once
inheritPrototype(SubType, SuperType); // works
//myInheritPrototype(SubType, SuperType); // works
//myInheritPrototype2(SubType, SuperType); // also works, but should it?

SubType.prototype.sayAge = function() {
    console.log(this.age);
}
4

1 に答える 1

1

一見すると、1 番目と 2 番目は基本的に同じ ( object == Object.create ) です。3 番目の関数では、subType.prototypesuperType.prototypeは同じオブジェクトであるため、SuperType のインスタンスは SubType のインスタンスにもなります。

function SuperType() {}
function SubType() {}

myInheritPrototype2(SubType, SuperType); 
console.log(new SuperType() instanceof SubType) // true
于 2013-06-15T07:49:51.050 に答える