基类中有一个函数 hi 。子类中有一个属性名称。
function Base() {}
Base.prototype.hi = function () {
console.log("hi " + this.name);
}
function Sub(name) {
this.name = name;
}
Sub.prototype = new Base();
mySub = new Sub("rohita");
mySub.hi();
输出
hi rohita
基类的此如何能够从 hi 函数中的子类访问名称属性?
这不符合oops基础吗?
答案 0 :(得分:0)
您误解了您所代表的示例。 Sub
类的所有实例都具有name
属性,相反,没有Base
类实例可以访问name
属性。
仔细看看:
mySub = new Sub("rohita");
mySub.hi();
// since Sub class doesn't override the hi method, it falls back to the parent's one,
// thus this.name is valid for any instances of Sub class.. not of Base class,
// Base class instances doesn't really access the name property of Sub class..
// to prove this let's log out `this.name` for any instance of Base class,
// it'll be simply `undefined`, but for the Sub class, it's the one already defined by Sub class itself
myBase = new Base();
myBase.hi(); // => hello undefined // makes sense now, right?
这是如何从基类中访问子类的name属性 函数中的类?
this
类的 Base
并没有真正访问Sub
类的属性,显然this.name
是undefined
类的Base
换句话说,Base
类的任何实例。
由于Sub
类不会覆盖从hi
类继承的Base
方法,因此在hi
实例上调用Sub
会退回到父实例,在这种情况下,this
显然是指Sub
类,因此它是name
属性。