原型模式
每个函数(准确说不是类、对象)都有一个prototype属性,这个属性是一个指针,指向一个对象。
使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法。
1.原型对象
(1)当创建一个新函数,就会为该函数创建一个prototype属性,这个属性指向函数的原型对象。
(2)默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向 prototype属性所在函数 的指针。
(3)实例的内部包含一个指针,叫[[Prototype]]。不过这个指针对脚本则完全不可见(某些浏览器支持一种__proto__来访问)。
2.代码读取属性顺序
首先搜索对象实例本身,没有则继续搜索指针指向的原型对象。
例:
function Person(){
}
Person.prototype.name="Javascript";
var p1 = new Person();
var p2 = new Person();
p1.name="lufeng";
alert(p1.name);//"lufeng"
alert(p2.name);//"Javascript"
使用delete操作符可以完全删除实例属性。
isPrototypeOf():确定对象之间是否存在prototype关系
hasOwnProperty():检测一个属性是存在于实例中,还是存在原型中。
Object.keys()、Object.getOwnPropertyNames():接收一个对象作为参数,返回
一个包含所有可枚举属性的字符串数组。
来看个很蛋疼的类继承(某个HTML5游戏框架):
inherit : function(childClass, parentClass) {
var Constructor = new Function();
Constructor.prototype = parentClass.prototype;
childClass.prototype = new Constructor();
childClass.prototype.constructor = childClass;
childClass.superclass = parentClass.prototype;
if(childClass.prototype.constructor == Object.prototype.constructor) {
childClass.prototype.constructor = parentClass;
}
}
感觉代码看来比较乱,我画了个图: