2017-02-05 7 views
2

は原型継承のこのコードを参照してください。原型継承:いいえ違いコンストラクタassingmentを省略

var Person = function() { 
 
    this.canTalk = true; 
 
}; 
 

 
Person.prototype.greet = function() { 
 
    if (this.canTalk) { 
 
    console.log('Hi, I am ' + this.name); 
 
    } 
 
}; 
 

 
var Employee = function(name, title) { 
 
    Person.call(this); 
 
    this.name = name; 
 
    this.title = title; 
 
}; 
 

 
Employee.prototype = Object.create(Person.prototype); 
 
// Note: there's no difference, when I comment out the following line 
 
Employee.prototype.constructor = Employee; 
 

 
Employee.prototype.greet = function() { 
 
    if (this.canTalk) { 
 
    console.log('Hi, I am ' + this.name + ', the ' + this.title); 
 
    } 
 
}; 
 

 
var bob = new Employee('Bob', 'Builder'); 
 

 
bob.greet();

私は行をコメントアウトしても同じ結果(コンソール出力)を得るか

Employee.prototype.constructor = Employee; 

次に、関数プロトタイプコンストラクタを関数自体に等しくする価値はありますか?私はJSの初心者です。それは長期的にも効果がある場合。 どのように?私は回避策を望んでいません。

+0

'(新しい関数Foo(){})コンストラクタ。 // function Foo(){} ' –

+0

[なぜプロトタイプのコンストラクタを設定する必要がありますか?]の複製がありますか?(http://stackoverflow.com/questions/8453887/why-is-it-necessary-to-set- the-prototype-constructor) –

+1

デフォルトのプロトタイプをオーバーライドすると、コンストラクタなどに関するデータが失われます。 bar(){}; '' Bar.prototype = Object.create({}); //関数Object(){[native code]} '、すなわち' Bar'ではない –

答えて

0

次に、関数プロトタイプのコンストラクタを関数自体にイコライズする価値はありますか?

本質的な価値があり、実用的なものがいくつかあります。

まず、派生クラスのプロトタイプに正しいコンストラクタを設定すると、物事は対称になります。つまり、プロパティ.constructorは、という関数を作成したを直感的に示唆する目的で使用されます。


var Person = function() {}; 
var Employee = function() {}; 

Employee.prototype = Object.create(Person.prototype); 
// Employee.prototype.constructor = Employee; 

var bob = new Employee(); 

console.log(bob.constructor); 
console.log(bob.__proto__.constructor); 
console.log(bob.__proto__.__proto__.constructor); 
console.log(bob.__proto__.__proto__.__proto__.constructor); 

// [Function: Person] 
// [Function: Person] 
// [Function: Person] 
// [Function: Object] 

var Person = function() {}; 
var Employee = function() {}; 

Employee.prototype = Object.create(Person.prototype); 
Employee.prototype.constructor = Employee; 

var bob = new Employee(); 

console.log(bob.constructor); 
console.log(bob.__proto__.constructor); 
console.log(bob.__proto__.__proto__.constructor); 
console.log(bob.__proto__.__proto__.__proto__.constructor); 

// [Function: Employee] 
// [Function: Employee] 
// [Function: Person] 
// [Function: Object] 

は第二に、あなたはコンストラクタ関数を使用する必要がある場合、あなたはむしろ、関数名を使用するよりも、.constructor参照からそれを使用することができます。この点は、このasnwerでは詳述されていますhttps://stackoverflow.com/a/8454111/1343488


私はJSで初心者です。

私はあなたのウェブサイトを訪問をお勧めします:http://www.javascripttutorial.net/

JSの概念上に勉強するのに最適なサイトです。

関連する問題