'继承'的Typescript代码中第一个'for'是做什么的?

时间:2015-11-25 18:02:54

标签: javascript inheritance typescript prototype

我正在阅读typescript page,在“继承”部分,我发现了这个功能:

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的价值,但控制台没有显示任何内容!

起初我认为forb个属性复制到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);

我在控制台中看不到任何内容。

2 个答案:

答案 0 :(得分:0)

稍微去混淆可能会使其更加明显。

for (var propertyName in objectToExtend){
    if (objectToExtend.hasOwnProperty(properyName)) {
        targetObject[propertyName] = objectToExtend[propertyName];
}

因此它将属性值从第一个参数复制到第二个参数,但只有在第一个参数本身实际定义了这些属性时:此循环将忽略在第一个参数的原型上定义的任何内容。

答案 1 :(得分:0)

  

起初我认为forb的属性复制到d

确实如此。 d是要从b继承的类,确切地说,它是构造函数。此循环会将所有静态成员(方法和其他属性)从一个类复制到另一个类,以便您也可以在子构造函数上调用它们。

在ES6中,这种关系甚至是动态的,其中所有子构造函数都从父构造函数对象继承原型;但通常复制类的定义就足够了。

  

但我现在不确定,因为我认为这个循环没有执行任何迭代。

如果您没有声明为static的任何类成员,那可能就是这样。