javascript 设计模式一:原型模式
javascript
1-1:我们创建的每个函数都有一个prototype(原型)属性,这个属性时一个指针,指向一个对象。这里为Person.prototype
这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
字面量理解为对象实例的原型对象。
好处:即让所有对象实例共享它原型属性指向对象的属性和方法。我感觉如同java中static关键字,只有一份,但又不尽相同。
//以下代码实例都已这个为基础,相同部分就省略了 function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); var person2 = new Person();
person1.sayName(); //Nicholas person2.sayName(); //Nicholas alert(person1.sayName == person2.sayName); //true sayName属性都指向同一个地址 即在内存中只占用了一块存储空间
类java模式
1 function Person1(){ 2 this.name = "han"; 3 this.sayName = function(){ 4 alert(this.name); 5 } 6 } 7 var person3 = new Person1(); 8 person3.sayName(); 9 var person4 = new Person1(); 10 alert(person3.sayName == person4.sayName); // 11 false 每一个实例都要生成各自的sayName指向不同的内存地址
1-2几个重要属性
以前面Person为例
Person.prototype.constructor 指向Person。所有原型对象自动获取一个constructor(构造函数)属性
preson1中__proto__指向Person.prototype原型对象。注意,这个连接存在于实例与构造函数的原型对象之间,测试方法isPrototypeOf()
例:
alert(Person.prototype.isPrototypeOf(person1)) //true alert(Person.prototype.isPrototypeOf(person2)) //true
1-3 属性访问原则(逐级搜索)
读取一个对象的某个属性时都会执行一次搜索,目标是给定的属性名,首相从对象实例本身开始,如果找到则返回该属性值,如果未找到,则继续搜索指针指向的原型对象,原型对象中找到则返回该属性值,否则则是没有。
1-4 原型属性覆盖
如果在实例中添加一个跟原型对象相同的属性名,则该属性会屏蔽原型中的属性(对象实例无法重写原型中的值)
person1.name = "han"; alert(person1.name); // "han"——来自实例 alert(person2.name); // "Nicholas"——来自原型
1-5 delete操作符,删除实例属性
person1.name = "han"; alert(person1.name); // "han"——来自实例 alert(person2.name); // "Nicholas"——来自原型
delete person1.name;
alert(person1.name); // "Nicholas"——来自原型
1-6 hasOwnProperty()从Object继承来的,检测一个属性时存在于实例中,还是存在于原型中。
person1.name = "han"; alert(person1.name); //"han"; --来自实例 alert(person1.hasProperty("name")); //true alert(person2.name); //"Nicholas" --来自原型 alert(person2.hasProperty("name")); //false
1-7