许多OO语言都支持两种继承方式:接口继承和实现继承。
接口继承只继承方法签名,而实现继承则继承实际的方法。
由于函数没有签名,在ECMAScript中无法实现接口继承,只支持实现继承,而且其实现继承主要是依靠原型链来实现的。
- instanceof()检测对象类型
var a = {};
a instanceof Object // true
- isPrototypeof()
确定对象之间是否存在关系
如果[[Prototype]]指向调用isPrototyprof()方法的对象(Person.prototype)那么这个方法就返回true
alert(Person..prototype.isPrototypeof(person1)) //true
(这里person1是Person的一个实例)
- Object.getPrototypeof(),这个方法返回[[Prototype]]的值。
Object.getPrototypeof()返回的对象实际就是这个对象的原型。
第二行代码取得了原型对象中name的值,也就是"Nicholas"。
alert(Object.getPrototypeof(person1) == Person.prototype); //true
alert(Object.getPrototypeof(person1).name); //"Nicholas"
- delete 使用这个操作符可以完全删除实例属性
function Person(){
}
Person.prototype.name = "zhangsan";
var person1 = new Person();
var person2 = new Person();
person1.name = "lisi";
alert(person1.name);//"lisi" ——来自实例
alert(person2.name);//"zhangsan" ——来自原型
delete peison1.name;
alert(person1.name);//"zhangsan" ——来自原型
- hasOwnProperty()是否有自己的实例属性
function Person(){
}
Person.prototype.name = "zhangsan";
var person1 = new Person();
var person2 = new Person();
person1.name = "lisi";
alert(person1.hasOwnProperty("name"));//true
alert(person2.hasOwnProperty("name");//false
delete peison1.name;
alert(person1.hasOwnProperty("name"));//flase
- Object.getOwnPropertyDescriptor() 用于取得实例属性的描述符
要取得原型属性的描述符,必须直接在原型对象上调用Object.getOwnPropertyDescriptor()。
- Object.keys()
取得所有可枚举的实例属性
function Person(){
}
Person.prototype.name = "zhangsan";
Person.prototype.age = 28;
Person.prototype.job = "software engineer";
Person.prototype.sayName =function(){
alert("this.name")
}
var keys = Object.keys(Person.prototype);
alert(keys); //"name,age,job,sayName"
var p1 = new Person();
p1.name = "Rob";
p1.age = 27;
var p1keys = Object.keys(p1);
alert(p1keys); //"name,age"
变量keys中将保存一个数组。
如果你想得到所有实例属性,无论是否可枚举,都可以使用Object.getOwnPropertyNames()方法。
var keys = Object.getOwnPropertyNames(Person.prototype);
alert(keys); //"constructor, name, age, job, sayName"
注意结果中包含了不可枚举的constructor属性。
Object.keys() 和 Object.getOwnPropertyNames() 都可以代替for-in循环。