我正在阅读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
的价值,但控制台没有显示任何内容!
起初我认为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);
我在控制台中看不到任何内容。
答案 0 :(得分:0)
稍微去混淆可能会使其更加明显。
for (var propertyName in objectToExtend){
if (objectToExtend.hasOwnProperty(properyName)) {
targetObject[propertyName] = objectToExtend[propertyName];
}
因此它将属性值从第一个参数复制到第二个参数,但只有在第一个参数本身实际定义了这些属性时:此循环将忽略在第一个参数的原型上定义的任何内容。
答案 1 :(得分:0)
起初我认为
for
将b
的属性复制到d
。
确实如此。 d
是要从b
继承的类,确切地说,它是构造函数。此循环会将所有静态成员(方法和其他属性)从一个类复制到另一个类,以便您也可以在子构造函数上调用它们。
在ES6中,这种关系甚至是动态的,其中所有子构造函数都从父构造函数对象继承原型;但通常复制类的定义就足够了。
但我现在不确定,因为我认为这个循环没有执行任何迭代。
如果您没有声明为static
的任何类成员,那可能就是这样。