原型(prototype)
每个对象创建时都会关联一个prototype属性,prototype指向该对象的原型对象。并可以通过prototype调用或访问原型对象的方法和属性。如编写一个只包含基本数据类型属性的构造函数,那么该构造函数实例化后对应的原型对象便为object。
当使用某个对象的prototype属性构造方法或属性后,该对象可以直接访问到该方法/属性,无需再通过prototype/__proto__使用,类似于c++中的类,子类继承了父类的方法并可以直接调用。对象(未实例化)也可以通过prototype属性调用到构造函数里的属性,类似于c++中的静态成员,未经过实例化仍然可以访问。
person.prototype.h = 18; console.log(person.prototype.h); console.log(person.h);
下文中的person实例化对象person1也可以直接访问到h属性。
__proto__属性:
每个对象对象实例化后都会有__proto__属性,调用该属性得到该对象的原型对象。
function person(name, age) { this.name = name; this.age = age; // this.say = say; } var person1 = new person('xxx', 99); console.log(person1.__proto__); console.log(person.prototype); console.log(person1.__proto__ === person.prototype);
当实例对象调用某方法或属性时,若当前对象没有该方法或属性,那么程序会找到该对象的原型对象,查找是否含有该方法或属性。原型对象也是对象,自然也有原型对象,如果在原型对象中仍找不到该属性或方法,那么会找到原型对象的原型对象,直至找到该属性或方法或原型对象为null为止。而一个个原型对象构造出来的链式结构便为原型链,原型链的顶部时object对象,object对象的原型对象为null。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)