接下来我们在看一种继承的实现。这需要再次利用构造器函数入手,这回不直接使用对象了。由于在这种继承模式中,子对象构造器可以通过call()和apply()方法来调用父对象的构造器。因而可以被称作构造器盗用法。

我们在这里call()和apply()方法更进一步的讨论一下,虽然之前说过一些,只不过都是基础性的吧。

这两个方法都允许我们将一个对象的this值一个函数的调用绑定起来。

下面,我们来构建一个父类构造器Shape();

function Shape(id){
    this.id = id;
}
shape.prototype.name = 'shape';
shape.prototype.toString = function(){
    return this.name;
}

现在我们来定义Triangle()构造器,在其中调用apply()方法来调用Shape()构造器,并将相关的this值(即new Triangle()所创造的实例)和其他一些传递参数的方法。

function Triangle(){
    Shape.apply(this.arguments);
}
Triangle.prototype.name = 'Anna';

注意,这里无论是Triangle()还是Shape()都在其各自的原型中添加一些额外的方法。

var t = new Triangle(101);
t.name; // Anna

在这里,新的triangle对象继承了其父对象的id属性,但她没有继承父对象原型中的其他东西。

t.id;
t.toSting(); // [Object Object];

为什嘛没有继承shape属性呢?是因为我们从来没有new shape()创建一个实例,自然原型没有被用到。

function Triangle(){
    Shape.apply(this, anguments);
}
Triangle.prototype = new Shape();
Triangle.prototype.name = 'Jock';

这种继承模式中,父对象的属性是以子对象自身的属性的身份来重建的。这也体现了构造器借用的一大优势;当我们创建一个继承于数组或其他对象时,将获得一个完完整整的新值(不是一个新值),对他做任何修改都不会影响到其他父对象。

但这种模式也是有缺点的,因为这种情况下父对象的构造器往往会被调用2次:一次发生在通过apply()方式继承继承自身属性,而另一次则发生在new操作符继承其原型时。这样一来,父对象的自身属性事实上被继承了两次。

function Shape(id){
    this.id = id;
}
function Triangle(){
    Shape.apply(this, argument);
}
Triangle.prototype = new Shape(101);

然后我们新建一个实例:

var t = new Triangle(202);
t.id; // 202;

如您所见,对象有一个自身属性id,但她并非来自原型链中,我们可以执行如下验证:

t._proto_.id;
delete t.id;
t.id; 

javascript --- 构造器借用的更多相关文章

  1. Constructor JavaScript构造器模式。

    构造器模式 : Constructor模式中, 通过在构造器前面加 new 关键字, 告诉JavaScript 像使用构造器一样实例化一个新对象,并且对象成员由该函数定义. 构造器内, 使用this ...

  2. javascript继承之借用构造函数与原型

    javascript继承之借用构造函数与原型 在js中,关于继承只有利用构造函数和原型链两种来现实.以前所见到的种种方法与模式,只不过是变种罢了. 借用构造函数 1 2 3 4 5 6 7 8 9 1 ...

  3. 详解Javascript的继承实现(二)

    上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...

  4. javascript 中继承实现方式归纳

    转载自:http://sentsin.com/web/1109.html 不同于基于类的编程语言,如 C++ 和 Java,javascript 中的继承方式是基于原型的.同时由于 javascrip ...

  5. javascript的面向对象思想知识要点

    获取数据类型 typeof undefined:访问某个不存在的或未经赋值的变量时就会得到一个 undefined,用typeof 获取类型,得到的也是undefined;null:它不能通过java ...

  6. javascript --- 继承小结

    回顾之前学到的知识,大体上可以分为两类: 1. 基于构造器工作的模式. 2. 基于对象的工作模式. 3. 是否使用原型 4. 是否执行属性拷贝. 5. 两者都有(执行原型属性拷贝) 下面我们把之前的知 ...

  7. 读《JavaScript面向对象编程指南》(二)

    第五章 原型 在JavaScript中,所有函数都会拥有一个 prototype 的属性,默认初始值为空对象. 可以在相关的原型对象中添加新的方法和属性,甚至可以用自定义对象来完全替换掉原有的原型对象 ...

  8. JavaScript学习总结(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. JavaScript增强AJAX基础

    <title>js类型</title> <meta http-equiv="content-type" content="text/html ...

随机推荐

  1. UVa - 1593 代码对齐(STL)

    看上去十分麻烦的一道题,但是看了看别人的写法感觉大神们写的无比简单. 就是记一个每列单词的最大长度,然后剩下的事交给NB的iomanip头文件就好. stringsteam是一个神奇的东西. #inc ...

  2. SQL_4_函数

    在SQL的函数中可以执行一些诸如对某一些进行汇总或将一个字符串中的字符转换为大写的操作等: 函数有:汇总函数.日期与时间函数.数学函数.字符函数.转换函数与其他函数. 汇总函数 这是一组函数,它们返回 ...

  3. 01_Java 软、弱引用语法介绍

    文章导读: 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用, 本章内容介绍了Reference的概 ...

  4. C++ 将string转换成char*字符串

    我们经常会使用C和C++的混合编程,在某些情况下,需要将C++的string,转换成char* 的字符串.下面说两种可行的方法,作为总结. 1. data(); 如: string str=" ...

  5. js中的事件委托和事件代理详解

    起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没弄明白,写这个一是为了备忘,二是给其他的知其然不知其所以然的小伙伴们以参考: 概述: 那什么叫事件委托呢?它 ...

  6. [转]zsh快捷键记录

    转自: http://wdxtub.com/2016/02/18/oh-my-zsh/ 使用技巧 连按两次Tab会列出所有的补全列表并直接开始选择,补全项可以使用 ctrl+n/p/f/b上下左右切换 ...

  7. c++中vector容器的功能及应用。

    vector基本操作:  1.头文件 #include<vector>. 注:一定要加上using namespace std;  2.vector对象的创建: vector<int ...

  8. Spring_mvc的搭建以及实现

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...

  9. hdu6035[dfs+思维] 2017多校1

    /*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; ; const ...

  10. ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)

    Problem D: (ds:树)合并果子 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 80  Solved: 4 [Submit][Status][ ...