function Person(){}
Person. prototype .dance = function(){};
function Ninja(){}
Ninja. prototype = new Person( );
object. defineProperty(Ninja. prototype, " constructor", {
enumerable: false,
value: Ninja,
writable: true ←---定义一个 新的不可枚举的constructor属性,属性值为Ninja
});
var ninja = new Ninja();
assert(ninja . constructor === Ninja,
"Connection from ninja instances to Ninja constructor
reestablished!");
←--- 重新建立ninja实例与Ninja构造器的联系
for(let prop in Ninja. prototype){
assert(prop === "dance", "The only enumerable property is dance!");
←---在Ninja. prototype.上没有定义可枚举的属性
}
现在执行代码,重新建立了ninja实例与Ninja构造器之间的联系,所以可以确定ninja实例是通过Ninja构造器创建的。此外,如果遍历Ninja.prototype对象,可 确保不会访问到constructor属性。现在这是-一个真正的“忍者”,进去完成工作,然后离开,不引起任何人的注意!
在ES6中 实现继承
class Person {
constructor( name){
this.name = name;
}
dance(){
return true;
}
}
class Ninja extends Person { --- 使用关键字extends实现继承
constructor(name, weapon){
super(name) ; ---_使用关键字super调用基类构造函数
this . weapon = weapon;
}
wieldWeapon(){
return true;
}
}
var person = new Person(" Bob");
assert( person instanceof Person,' "A person's a person" );
assert( person. dance( ),' 'A person can dance.");
assert( person. name === "Bob", "We can call it by name.");
assert(!(person instanceof Ninja), "But it's not a Ninja" );
assert( !("wieldWeapon" in person), "And it cannot wield a weapon") ;
var ninja = new Ninja( "Yoshi", "Wakizashi");
assert(ninja instanceof Ninja, "A ninja's a ninja");
assert(ninja. wieldWeapon(), "That can wield a weapon"); .
assert(ninja instanceof Person, "But it's also a person");
assert(ninja.name === "Yoshi","That has a name");
assert(ninja.dance(),"And enjoys dancing" );