JavaScript ----------------- 原型式继承

 思想:借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。为了达到这个目的,看看下面的实现方式

  

1        function object(o){
2             function F(){
3                 
4             }
5             F.prototype=O;
6             return new F();
7         };

在上面的代码段中主要做了哪些事情尼?

  创建了一个临时的构造函数,同时把传入参数作为临时构造函数的原型,最后返回一个临时构造函数的实例;从本质上来讲,object 对传入其中的对象执行了一次浅复制;

  

 1      
      //看实例:
      function object(o){ 2 function F(){ 3 4 } 5 F.prototype=o; 6 return new F(); 7 }; 8 9 //在上面中 10 11 var person={ 12 name:"Nicholas", 13 friends:["Shelby","Court","Van"] 14 } 15 16 var person1 = object(person); 17 person1.name = "Greg"; 18 person1.friends.push("Rob"); 19 20 21 var person2 = object(person); 22 person2.name = "Linda"; 23 person2.friends.push("Barbie"); 24 25 alert(person.friends); // Shelby Court Van Greg Rob

对于这种继承方式必须依赖于存在一个对象作为另一个对象的基础。如果有这么一个对象的话,可以把它传递给object()函数,然后再根据具体需求对得到的对象加已修改即可。

实例从结果可以看出,person1与person2 就是person对象的副本。

ECMAScript5中通过新增Object.create() 方法规范化了原型式继承。这个方法接收两个参,当只传一个参数的时候与object()行为相同。

@param1   接收一个对象
@param2   可选  接受一个为新对象定义的额外属性的对象,类似 Object.defineProperties()方法的参数格式相同:每个属性都是通过自己的描述符定义的;已这种方式创建属性都会覆盖原型上的同名属性。
Object.create()
        var person={
            name:"Nicholas",
            friends:["Shelby","Court","Van"]
        }
        
        var person1 = Object.create(person,{
            name:{
                value:"Greg"
            }  
        });
        person1.name;  // Greg   

    
 1       var person={
 2             name:"Nicholas",
 3             friends:["Shelby","Court","Van"]
 4         }
 5         
 6         var person1 = Object.create(person,{
 7             name:{
 8                 value:"Greg",
 9                 enumerable:false
10             }  
11         });
12        name in person1;  // false
13         

  综合上一篇的组合继承,在没有必要创建构造函数,而指想让一个对象与另一个对象保持类似的情况下,原型式继承是完全可以胜任的。不过别忘了,包含引用类型值得属性始终都会共享相应的值,就像使用原型模式一样。

 

  

posted @ 2016-06-25 16:29  czhyuwj  阅读(193)  评论(0编辑  收藏  举报