JavaScript中的原型模式

一、    Prototype:每个函数(函数也可以理解为对对象)都有一个prototype属性,是一个指向某个对象的指针,这里所说的“某个对象”是由特定类型的所有实例共享的属性和方法构成的一个对象。可以简单的理解为由构造方法创建的对象的原型对象。

JavaScript中的原型模式

二、    定义方式

	        function Person(){}
		
		Person.prototype.name = "zhangsan";
		Person.prototype.age =23;
		Person.prototype.sayHello = function(){
			return "hello,I'm zhangsan";
		};
 

     因为每个函数都有prototype属性,而prototype又是指向原型对象的一个指针,所有我们就可以采用“.”的方式去定义原型对象的属性和方法。接下来,创建Person对象的时候就可以直接调用构造函数来创建。

                var person1 = new Person();
		var person2 = new Person();
 

 person1、person2对象都共享原型对象所有的属性和方法,我们可以从以下输出结果可以看出来:

 

                alert(person1.name);    //zhangsan
		alert(person2.name);    //zhangsan
		alert(person1.sayHello());  //hello,I’m zhangsan
		alert(person2.sayHello());  //hello,I’m zhangsan
 

 三、    深入理解原型对象

 1.construtor:所有原型对象都有一个construtor属性,他是指向prototype 属性所在的函数的一个指针,可以用下面语句检测:
alert(    Person.prototype.constructor == Person);//true


2.Person.prototype.constructor与Person.constructor的对比

alert(	Person.prototype.constructor) // function Person() {}
alert(Person.constructor); //function Function() {[native code]}
 

 一个alert语句很好理解,因为在前面已经说明constructor指向的就是Person()函数,但是第二个alert显示的是Function()函数,究及原因还得从“函数与对象”的关系说起。

 

         alert(typeof Person);   //function
	alert(Person instanceof Object);  //true
 

 从上面两个结果可以看出,Person是一个函数,但是他可以作为对象存在,从这里我们就能很好的理解Person.constructor显示的信息为什么是“function Function() {[native code]}”了。具体可以这样去分析:

因为:function Person(){}等同于var Person = new Function(){};

JavaScript中的原型模式

 

代码的准备:

function Person(){}

var Person = new Function(){}

现在我们就开始来看图说话: Person 引用指向的是 Function 实例(即中间的矩形框,右边的椭圆只是为了说明它左边表示一个对象)

Person.constructor 可以这样去追踪 : Person 引用 ”—->prototype à constructor à Function(){} 最后指向的是 Function 函数 ( 对象 ) 所以 alert(Person.constructor); 得到的值为: function Function() {[native code]}

JavaScript中的原型模式


所以alert(    Person.prototype.constructor)的值为:function Person() {}

4.每个person实例都包含一个内部属性_proto_,这个属性指向了原型对象。可以用isPrototypeOf()判断
alert(Person.prototype.isPrototypeOf(person1))//true.


5.对象读取属性或方法的步骤:从对象实例本身开始,如果找到了给定名字的属性,则返回该值,如果没有读到,则继续查找该实例内容属性_proto_指向的原型对象中查找。注意:如果实例本身有一个与原型实例相同名字的属性,那么原型实例中的属性将被屏蔽(不是覆盖,原型对象中的该属性的值依然保持原来的值不变)。使用delete可以删除实例中的属性,从而重新获取原型实例中的属性。

                alert(person1.name); //zhangsan
		person1.name="lisi";
		alert(person1.name); //lisi
		alert(Person.prototype.name);//zhangsan
                 delete person1.name;
		alert(person1.name);  //zhangsan
 

 6.使用hasOwnProperty(name)(该方法继承于Object)判断属性是对象实例本身还是来自于原型对象中。

 

 

		alert(person1.hasOwnProperty(“name”)); //false
		peson1.name=”lisi”;
		alert(person1.hasOwnProperty(“name”)); //true
 

 

7.判断属性来自于原型属性是需要用的in操作符
单独使用in时,通过对象能够访问的给定的属性值时返回true,而不在乎是从原型中还是实例中访问的。

!peron1.hasOwnProperty(“name”)&&(“name” in person1)  //true
 

今天就写到这里,期待下期的精彩!!!


你可能感兴趣的:(JavaScript,prototype)