概述

这是我在看JavaScript面向对象编程指南的时候,对constructor和继承的总结。

关于它们的详细知识,可以上网查到,所以我只写那些网上没有的。

内容

  • constructor的理解
  • constructor的实际用途
  • constructor的陷阱
  • 从应用角度理解继承
  • 函数构造器的继承
  • 纯对象的继承

constructor的理解

constructor 属性是一个指针,指向创建此对象的函数。(可以更改)

constructor的实际用途

看下面这段代码:

var a,b;
(function(){
function A (arg1,arg2) {
this.a = 1;
this.b=2;
} A.prototype.log = function () {
console.log(this.a);
}
c = new A();
})()
c.log();
// 1

实例c是用闭包建立的,但是因为A是在闭包里面,所以我们不能直接访问A。但是如果需要给A添加方法怎么办呢?方法是用constructor

c.constructor.prototype.log2 = function () {
console.log(2)
} c.log2();
// 2

constructor的陷阱

//继承
Child.prototype = new F();
Child.prototype.constructor = Child;

我们一般在继承中,要给constructor属性进行重置,比如上面那段代码,这是为什么呢?

先来看看一个例子:

function Dog(){this.tail = true;}
var benji = new Dog();
Dog.prototype.say = function(){return 'woof';}; Dog.prototype = {paws:4}
var lucy = new Dog(); benji.constructor.prototype.paws
//4
lucy.constructor.prototype.paws
//undefined

其中,benjilucy都是Dog()的子对象,但是结果却不相同。造成这种结果的原因是Dog.prototype = {paws:4}重置了Dog()的原型。(原理不明,貌似和__proto__有关。)

如果在Dog.prototype = {paws:4}后面再加一条语句Dog.prototype.constructor = Dog;结果就一样了。这也是为什么在继承中要重置constructor的原因。

从应用角度理解继承

继承,就是对父元素的代码复用。

//父元素是函数构造器
function Parent() {
this.id = 3; //带this的自身属性
var od = 5; //不带this的自身属性
}
Parent.prototype.ud = 7; //原型属性 //父元素是纯对象
Parent= {id:9};
Parent.prototype.ud = 7;

综合考虑一下,父元素分为2种:函数构造器和纯对象。父元素里面的代码又分为自身属性和原型属性。(方法和属性差不多,所以只考虑属性。)

所以我们分别来讨论函数构造器和纯对象的代码复用,即属性继承。

函数构造器的继承

  • 只继承原型属性

很简单,只需要把父对象的原型赋值给子对象即可。(原型继承法

Child.prototype = Parent.prototype;

但是这样的话,修改子对象的原型会影响父对象的原型,所以我们考虑用闭包。(临时构造器法

var F = function() {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;

但是如果子对象的prototype本来就有值,所以不能直接进行prototype的赋值。这个时候我们可以直接把属性拷贝过去。(原型属性拷贝法

var p = Parent.prototype;
var c = Child.prototype;
for (i in p) {
c[i] = p[i];
}

当然,还有深拷贝法,这里就不贴代码了。

  • 只继承自身属性。

首先想到的就是拷贝法,上面贴过代码这里就补贴了。但是拷贝法只能继承父对象中不带this的自身属性。

如果想只继承带this的自身属性,可以用构造器借用法

function Child() {
Parent.apply(this, argument);
}

如果想全部继承的话,那就只能两者结合了。

  • 同时继承自身属性和原型属性

这个时候,我们第一个想到的就是用new。(原型链法

Child.prototype = new Parent();

需要注意的是,这时子对象仅继承父对象中带有this的自身元素,不继承不带this的自身元素。

其它方法就只能结合上面多个方法了。

纯对象的继承

  • 只继承原型属性。

和函数构造器的继承一样。

  • 只继承自身属性。

当父元素是纯对象的时候,它里面没有this的自身元素。所以只需用拷贝法即可。

另外,还可以把父元素的自身元素放到子元素的prototype里面去。(原型继承法)

function object() {
function F(){};
F.prototype = Parent;
return new F();
}
  • 同时继承自身属性和原型属性

这个就是结合上述方法了。

JavaScript中的constructor和继承的更多相关文章

  1. javascript中创建对象和实现继承

    # oo ##创建对象 1. 原型.构造函数.实例之间的关系 * 原型的construct->构造函数:调用isPrototypeOf(obj)方法可以判定和实例的关系:  * 构造函数的pro ...

  2. 谈谈javascript中的prototype与继承

    谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...

  3. 【转】JavaScript中的原型和继承

    请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...

  4. 深入浅析JavaScript中的constructor

    constructor 属性返回对创建此对象的数组函数的引用.本文给大家介绍JavaScript中的constructor ,需要的朋友参考下吧 定义和用法 constructor 属性返回对创建此对 ...

  5. javascript中的对象之间继承关系

    相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...

  6. 【转】JavaScript中的constructor与prototype

    最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...

  7. Javascript中的prototype与继承

    通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...

  8. 深入 JavaScript 中的对象以及继承原理

    ES6引入了一个很甜的语法糖就是 class, class 可以帮助开发者回归到 Java 时代的面向对象编程而不是 ES5 中被诟病的面向原型编程. 我也在工作的业务代码中大量的使用 class, ...

  9. javascript中的原型和继承

    javascript一直是初学者口中的难点,甚至一些有些许工作经验的人也不太明白其中的原理,而我就是那个初学者,前段时间在阮一峰老师的博客上看了一篇文章<javascript继承机制的设计思想& ...

随机推荐

  1. React Native在window下的环境搭建(一)

    React Native官方开发文档 以下是本人抄录的: 初次接触React Native感觉和React很像,却是有点类似,但不完全是,React Native有自己的组件对象,不过它也自定义的组件 ...

  2. 2018-2019-2 20175213实验三《敏捷开发与XP实践》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:吕正宏 学号:20175213 指导教师:娄嘉鹏 实验日期:2019年4月29日 实验时间:13:45 - 21:00 实验序号:实验 ...

  3. git clone Failed to connect to 127.0.0.1 port 43213: Connection refused

    不知道为什么使用git clone 的时候报了上面的错误,后面发现是 127.0.0.1 port 43213的端口被代理占用了,可以这样查看: $ env|grep -i proxy 结果是: NO ...

  4. Python设计模式 - 基础 - 七大基本原则

    提倡使用设计模式,主要出发点就是实现代码复用,增加代码的扩展性和可维护性.如何设计出简洁.易懂.灵活.优美的代码结构的确是一门学问,透彻理解并践行如下七大原则通常都能取得基本满意的结果: - 单一职责 ...

  5. 音频音乐播放 Service

    界面效果:         界面就一个播放的Button和一个进度条SeekBar,也可以自己加上两个显示时间的TextView: 点击播放时,有音乐声音,进度条也会自动更新,Button文字变成暂停 ...

  6. Yii2.0关闭自带的debug功能

    1.找到相应模块的config文件夹的main-local.php文件注释相关代码,如下: 2.将web下面的两个入口文件改成false  index.php  index-test.php

  7. js多维数组转一维数组

    1,使用map方法 var arr = [1,[2,[[3,4],5],6]]; function unid(arr){ var arr1 = (arr + '').split(',');//将数组转 ...

  8. 老毛子 Padavan 路由器固件开启教育网 IPv6 并实现IPv6转发

    老毛子 Padavan 路由器固件开启教育网 IPv6 并实现IPv6转发 文章目录[隐藏] 一.开启opt环境 二.开启 WAN 端 IPv6 三.安装并运行 6relayd 四.开机自动安装并配置 ...

  9. echo 转义字符的使用

    man echo 查看 echo 的使用文档 -n 不尾随换行符 -e 启用解释反斜杠的转义功能 -E 禁用解释反斜杠的转义功能(默认) --help 显示此帮助信息并退出 --version 显示版 ...

  10. Linux学习--- 宏定义下#、##的使用

    #   字符串化 ## 连接符号 eg: #include <stdio.h> #define ABC(x) #x #define DAY(c) myday##c int main (){ ...