JavaScript類とプロトタイプ属性の継承

2061 ワード

私たちはもう第一章でプロトタイプの属性を使って模擬類と継承の実現をしました.prototype属性は本質的にJavaScriptオブジェクトです.また、各関数にはデフォルトのプロトタイプの属性があります.
この関数がカスタムオブジェクトを作成するシーンに使用される場合、この関数をコンストラクターと呼びます.例えば次の簡単なシーン:
 
  
//
function Person(name) {
this.name = name;
}
// Person ,
Person.prototype = {
getName: function() {
return this.name;
}
}
var zhang = new Person("ZhangSan");
console.log(zhang.getName()); // "ZhangSan"
クラス比としては、JavaScriptにおけるデータの種類-文字列(String)、数字(Number)、配列(Aray)、オブジェクト(Object)、日付(Date)などを考えます.私たちはJavaScriptの内部でこれらのタイプが構造関数として実現されると信じています.
 
  
// , JavaScript
function Array() {
// ...
}
//
var arr1 = new Array(1, 56, 34, 12);
// , :
var arr2 = [1, 56, 34, 12];
配列動作の多くの方法(例えば、concat、join、push)もプロタイプ属性で定義されているはずです.
実際には、JavaScriptの固有データタイプはすべてリードオンリーのprototype属性を持っていますが、これらのタイプのprototype属性を修正したら、どのような事前定義の方法が消えてしまいますか?
 
  
// JavaScript Array
Array.prototype.min = function() {
var min = this[0];
for (var i = 1; i < this.length; i++) {
if (this[i] < min) {
min = this[i];
}
}
return min;
};
// Array min
console.log([1, 56, 34, 12].min()); // 1
注意:ここには落とし穴があり、Arayのプロトタイプに拡張方法を追加した後、for-i-nサイクル配列を使用すると、この拡張方法も循環されます.
以下のコードはこの点を説明します.
 
  
var arr = [1, 56, 34, 12];
var total = 0;
for (var i in arr) {
total += parseInt(arr[i], 10);
}
console.log(total); // NaN
解決方法も簡単です.
 
  
var arr = [1, 56, 34, 12];
var total = 0;
for (var i in arr) {
if (arr.hasOwnProperty(i)) {
total += parseInt(arr[i], 10);
}
}
console.log(total); // 103