繁体   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