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