2011-03-22 55 views
0

使用下面的代碼,面向從斯托揚的JavaScript對象Stefanov`s 95頁,如果你打電話的JavaScript面向的JavaScript

var my = new Triangle(5, 10); 
my.toString() 

你得到這樣的結果採取。

"shape, 2D shape, Triangle" 

我的問題與此代碼中的第一個函數(函數Shape)有關。

1)我知道length屬性通常會做什麼,但爲什麼它在代碼result[result.length]function Shape中很重要。如果代碼返回字符串「形狀,二維形狀,三角形」的數組,它在哪裏取名稱的長度以及它在名稱的長度上做了什麼?

2)請問您能解釋一下(用簡單的語言)程序在說什麼result[result.length]?即結果中有結果。

由於

function Shape(){} 
// augment prototype 
Shape.prototype.name = 'shape'; 
Shape.prototype.toString = function(){ 
var result = []; 
if (this.constructor.uber) { 
result[result.length] = this.constructor.uber.toString(); 
} 
result[result.length] = this.name; 
return result.join(', '); 
}; 


function TwoDShape(){} 
// take care of inheritance 
var F = function(){}; 
F.prototype = Shape.prototype; 
TwoDShape.prototype = new F(); 
TwoDShape.prototype.constructor = TwoDShape; 
TwoDShape.uber = Shape.prototype; 
// augment prototype 
TwoDShape.prototype.name = '2D shape'; 

function Triangle(side, height) { 
this.side = side; 
this.height = height; 
} 
// take care of inheritance 
var F = function(){}; 
F.prototype = TwoDShape.prototype; 
Triangle.prototype = new F(); 
Triangle.prototype.constructor = Triangle; 
Triangle.uber = TwoDShape.prototype; 
// augment prototype 
Triangle.prototype.name = 'Triangle'; 
Triangle.prototype.getArea = function(){return this.side * this.height/2;} 

回答

1
result[result.length] = this.name; 

這實質上是一種在下一個可用位置(偏移向前)向陣列中添加一塊新塊的方法。

在Javascript陣列從0開始,從而增加了第一陣列片時,它會在作用做到這一點:

result = []; 

// result is empty, so result.length == 0 
result[0] = this.name; 

然後,當下次toString()方法被調用時,它將採取的結果數組「長度」(計數),並創建索引處新陣列片:

// result has one piece, so result.length == 1 
result[1] = this.name; 

然後,當下次toString()方法被調用時,它會再次採取結果數組「長度」(計數)並在該索引處創建一個新的數組片:

// result has two pieces, so result.length == 2 
result[2] = this.name; 

因此,您有一個包含三個部分的數組,使用索引0,1,2或在添加數組部分時的結果數組碎片的計數。

1

該代碼假定result將是連續的整數的鍵陣列。 length這樣的數組將具有從0到length - 1的索引。因此,通過設置result[result.length] = something,會發生的情況是您將項目添加到該數組,並且新項目的索引比先前的最後一個索引高一個。

實際上,它將一個項目添加到數組中,同時保持索引編號連續,而不在項目索引之間留下任何空白空間。

0

數組的長度屬性始終是最高索引加1,因此在數組[array.length]處添加一個項目會在數組末尾添加一個項目。

這相當於的Array.push(...),有時首選,因爲一些(很)舊的瀏覽器不具有push方法,有時它的速度更快(有時它是慢)。