簡體   English   中英

“繼承”打字稿代碼中的第一個“ for”做什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM