文档章节

JavaScript中的继承之原型式继承

Marychain
 Marychain
发布于 2016/04/19 23:35
字数 738
阅读 107
收藏 2

原型式继承的思想是借用原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。

为了达到这个目的,给出如下函数:

function object(o){
    function F(){}
    F.prototype = o;
    return new F();    
}

  在object()函数内部,先创建一个临时性的构造函数,将传入的对象作为这个构造函数的原型,最后返回这个函数的新实例。说白了,就是对传入的对象执行一个浅复制,也就是说将创建的新对象F的原型对象指向o(我是这么理解滴)。

function object(o){
     function F(){}
     F.prototype = o;
     return new F();
     }

    var person = {
        name: "Nico",
        friends: ["Shlby","huu","dima"]
    };

    var anotherPerson = object(person);
    //var anotherPerson = Object.create(person);
    anotherPerson.name = "Greg";  //为实例添加自身属性以覆盖原型对象上的同名属性
    anotherPerson.friends.push("rob");

    var yetanotherPerson = object(person); 
   // var yetanotherPerson = Object.create(person);
    yetanotherPerson.name = "Linda";
    yetanotherPerson.friends.push("Barbie");
    
    alert(anotherPerson.name);   //Greg
    alert(anotherPerson.friends);   //Shlby,huu,dima,rob,Barbie
    alert(yetanotherPerson.name);   //Linda
    alert(yetanotherPerson.friends);   //Shlby,huu,dima,rob,Barbie
    alert(person.name);     //Nico
    alert(person.friends);    //Shlby,huu,dima,rob,Barbie

  这种原型式继承,要求你必须有一个对象可以作为另一个对象的基础。有这么一个对象的话,可以把它传给object()函数,再根据具体的需求对得到的对象加以修改即可(比如anotherPerson.name="Greg")。

在这个例子中,可以作为另一个对象基础的是person对象,于是把它传入object()函数中,然后该函数会返回一个新对象,这个对象将person作为原型,所以它的原型中就包含一个基本类型值属性和一个引用类型值属性。这意味着person.friends不仅属于person所有,而且也会被anotherPerson和yetAnotherPerson共享。实际上,这就相当于又创建了person对象的两个副本。

 

ECMAScript5新增了Object.create()规范了原型式继承,这个方法接受两个参数:一个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。在传入一个参数的情况下,Object.create()和object()方法的行为相同。如上被注释的代码。

 

Object.create()方法的第二个参数与Object.defineProperties()方法的第二个参数格式相同:每个属性都是通过自己的描述符定义的。以这种方式指定的任何属性都会覆盖原型对象上的同名属性。

例如:

var person ={
    name:"Nico",
    friends:["Shelby","Court","Van"]
}

var anotherPerson = Object.create(person,{
     name:{
           value:"Greg"
    }
});

alert(anotherPerson.name);    //Greg

  支持Object.create()方法的浏览器有:IE 9+,FF 4+,Safari 5+,Opera 12+,Chrome.

在没必要兴师动众地创建构造函数,只是想让一个对象与另一个对象保持类似的情况下,可以采用原型式继承。不过记住,包含引用类型值的属性始终会被实例共享,就像使用原型模式一样。

 

© 著作权归作者所有

上一篇: 最近的生活
下一篇: css3之transform
Marychain
粉丝 1
博文 20
码字总数 10134
作品 0
日本
程序员
私信 提问
JavaScript继承(五)——寄生式继承

首先回顾一下原型式继承: 寄生式继承是与原型式继承紧密相关的一种思路,并且同样也是由克罗克福德推而广之的。 说到寄生式继承不得不说工厂模式和寄生构造函数模式创建对象。下面来回顾一下...

Bob2100
02/13
24
0
前端基本功(七):javascript中的继承(原型、原型链、继承的实现方式)

1. js的继承机制 javascirpt没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。继承意味着复制操作......

大家都叫我四姨
06/18
0
0
JavaScript继承(四)——原型式继承

道格拉斯·克罗克福特在2006年提出了原型式继承,他的想法是基于已有的对象借助原型创建新对象,同时还不必因此创建一个自定义类型。为此,他给出了下面的函数: 在函数内部,先创建了一个临...

Bob2100
02/02
123
0
JavaScript 中的继承:ES3、ES5 和 ES6

选择一种继承方式 JavaScript 是一门动态语言,动态意味着高灵活性,而这尤其可以体现在继承上面。JavaScript 中的继承有很多种实现方式,可以分成下面四类: Mixin 模式,即属性混入,从一个...

天方夜
2018/10/30
0
0
JavaScript继承(六)——寄生组合式继承

JavaScript继承(三)——组合继承中讲到,组合继承是JavaScript中最常用的继承模式,但是它也有自己的不足之处,现在我们就来剖析它的不足,如下示例: 使用组合继承让继承实际上分为两步:...

Bob2100
02/16
37
0

没有更多内容

加载失败,请刷新页面

加载更多

编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
19分钟前
4
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
34分钟前
63
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
5
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
今天
8
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部