高程三 关于原型链 阅读笔记

2018-02-07  本文已影响10人  6659a0f02826

许多OO语言都支持两种继承方式:接口继承和实现继承。
接口继承只继承方法签名,而实现继承则继承实际的方法。
由于函数没有签名,在ECMAScript中无法实现接口继承,只支持实现继承,而且其实现继承主要是依靠原型链来实现的。

  1. instanceof()检测对象类型
var a = {};
a instanceof Object   // true
  1. isPrototypeof()
    确定对象之间是否存在关系
    如果[[Prototype]]指向调用isPrototyprof()方法的对象(Person.prototype)那么这个方法就返回true
alert(Person..prototype.isPrototypeof(person1))  //true
(这里person1是Person的一个实例)
  1. Object.getPrototypeof(),这个方法返回[[Prototype]]的值。
    Object.getPrototypeof()返回的对象实际就是这个对象的原型。
    第二行代码取得了原型对象中name的值,也就是"Nicholas"。
alert(Object.getPrototypeof(person1) == Person.prototype);  //true
alert(Object.getPrototypeof(person1).name);  //"Nicholas"
  1. 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" ——来自原型
  1. 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
  1. Object.getOwnPropertyDescriptor() 用于取得实例属性的描述符

要取得原型属性的描述符,必须直接在原型对象上调用Object.getOwnPropertyDescriptor()。

  1. 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循环。

上一篇 下一篇

猜你喜欢

热点阅读