[英]What does the first 'for' do in 'inheritance' Typescript code?
我正在閱讀打字稿頁面,並且在“繼承”部分中找到了此功能:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
當我閱讀此行時:
for (var p in b)...
我有一個問題:這個循環到底能做什么?
我試圖理解這一點,然后我改變了:
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
至
for (var p in b){
console.log(p);
if (b.hasOwnProperty(p)) d[p] = b[p];
}
因為我想知道p
的值,但是控制台什么也沒顯示!
起初,我以為for
b
的屬性復制到d
。 但是我現在不確定,因為我認為此循環未執行任何迭代。
我不明白這一點for
循環。 有誰能夠幫助我?
到目前為止,我認為for
對於該代碼沒有用,但是我想知道您的想法。
這是我擁有的完整代碼:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b){
console.log("iteration");
console.log(p);
if (b.hasOwnProperty(p)) d[p] = b[p];
}
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Animal = (function () {
function Animal(name) {
this.name = name;
}
Animal.prototype.move = function (meters) {
alert(this.name + " moved " + meters + "m.");
};
return Animal;
})();
var Snake = (function (_super) {
__extends(Snake, _super);
function Snake(name) {
_super.call(this, name);
}
Snake.prototype.move = function () {
alert("Slithering...");
_super.prototype.move.call(this, 5);
};
return Snake;
})(Animal);
var Horse = (function (_super) {
__extends(Horse, _super);
function Horse(name) {
_super.call(this, name);
}
Horse.prototype.move = function () {
alert("Galloping...");
_super.prototype.move.call(this, 45);
};
return Horse;
})(Animal);
var sam = new Snake("Sammy the Python");
var tom = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
我在控制台中看不到任何東西。
稍微消除混淆可能會使其更加明顯。
for (var propertyName in objectToExtend){
if (objectToExtend.hasOwnProperty(properyName)) {
targetObject[propertyName] = objectToExtend[propertyName];
}
因此,它將屬性值從第一個參數復制到第二個參數,但前提是這些屬性實際上是在第一個參數本身上定義的:此循環將忽略第一個參數的原型上定義的任何內容。
起初,我以為
for
b
的屬性復制到d
。
確實如此。 d
是將從b
繼承的類,確切地說,它是構造函數。 此循環確實將所有靜態成員 (方法和其他屬性)從一個類復制到另一個類,以便您也可以在子構造函數上調用它們。
在ES6中,這種關系甚至是動態的,其中所有子構造函數都原型地從父構造函數對象繼承; 但通常在類的定義中進行復制就足夠了。
但是我現在不確定,因為我認為此循環未執行任何迭代。
如果您沒有任何聲明為static
類成員,那可能就是這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.