我们创建的每个函数都有一个prototype(原型)属性。这个属性是一个对象,它的作用是包含可以有特定类型的所有实例共享的属性和方法。
function Box(){} //构造函数体内什么都没有,这里如果有,叫做实例属性,实例方法 Box.prototype.name = 'cai'; Box.prototype.age = 22; Box.prototype.run = function(){ return this.name +" is "+ this.age; } var box1 = new Box(); //实例化 var box2 = new Box(); //实例化 document.write(box1.run() == box2.run()); //true document.write("<br/>"+box1.__proto__+"<br/>"); //这是一个指针,只想prototype对象,它的作用是指向.[object Object] document.write(box1.constructor); //构造函数,可以获取构造函数本身 .function Box(){}
判断一个对象实例(对象引用)是不是指向原型对象,基本上,只要实例化了,它自动指向的。
document.write("<br/>"+Box.prototype.isPrototypeOf(box1)); //true
原型模式的执行流程
1.先查找构造函数实例里的属性和方法,如果有,立即返回。
2.如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回
box1.name = 'jack'; //实例属性,并没有重写原型属性 document.write("<br/>"+box1.name); //就近原则,jack delete box1.name; //删除实例中的原型 document.write("<br/>"+box1.name); //cai
判断实例中是否存在指定属性
box2.name = 'baojian'; document.write("<br/>"+box2.hasOwnProperty('name')); //判断实例中是否存在指定属性 true
in 操作符会在通过对象能够访问给定属性时返回true,无论实例属性还是原型属性。只有有就返回true,两边都没有就返回false。
//判断只有原型中有属性 function isProperty(object, property){ return !object.hasOwnProperty(property) && (property in object) } alert(isProperty(box1,'name'));