JavaScript中的constructor和继承
概述
这是我在看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
其中,benji和lucy都是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和继承的更多相关文章
- javascript中创建对象和实现继承
# oo ##创建对象 1. 原型.构造函数.实例之间的关系 * 原型的construct->构造函数:调用isPrototypeOf(obj)方法可以判定和实例的关系: * 构造函数的pro ...
- 谈谈javascript中的prototype与继承
谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- 深入浅析JavaScript中的constructor
constructor 属性返回对创建此对象的数组函数的引用.本文给大家介绍JavaScript中的constructor ,需要的朋友参考下吧 定义和用法 constructor 属性返回对创建此对 ...
- javascript中的对象之间继承关系
相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...
- 【转】JavaScript中的constructor与prototype
最初对js中 object.constructor 的认识: 在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下 ...
- Javascript中的prototype与继承
通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...
- 深入 JavaScript 中的对象以及继承原理
ES6引入了一个很甜的语法糖就是 class, class 可以帮助开发者回归到 Java 时代的面向对象编程而不是 ES5 中被诟病的面向原型编程. 我也在工作的业务代码中大量的使用 class, ...
- javascript中的原型和继承
javascript一直是初学者口中的难点,甚至一些有些许工作经验的人也不太明白其中的原理,而我就是那个初学者,前段时间在阮一峰老师的博客上看了一篇文章<javascript继承机制的设计思想& ...
随机推荐
- React Native在window下的环境搭建(一)
React Native官方开发文档 以下是本人抄录的: 初次接触React Native感觉和React很像,却是有点类似,但不完全是,React Native有自己的组件对象,不过它也自定义的组件 ...
- 2018-2019-2 20175213实验三《敏捷开发与XP实践》实验报告
一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:吕正宏 学号:20175213 指导教师:娄嘉鹏 实验日期:2019年4月29日 实验时间:13:45 - 21:00 实验序号:实验 ...
- 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 ...
- Python设计模式 - 基础 - 七大基本原则
提倡使用设计模式,主要出发点就是实现代码复用,增加代码的扩展性和可维护性.如何设计出简洁.易懂.灵活.优美的代码结构的确是一门学问,透彻理解并践行如下七大原则通常都能取得基本满意的结果: - 单一职责 ...
- 音频音乐播放 Service
界面效果: 界面就一个播放的Button和一个进度条SeekBar,也可以自己加上两个显示时间的TextView: 点击播放时,有音乐声音,进度条也会自动更新,Button文字变成暂停 ...
- Yii2.0关闭自带的debug功能
1.找到相应模块的config文件夹的main-local.php文件注释相关代码,如下: 2.将web下面的两个入口文件改成false index.php index-test.php
- js多维数组转一维数组
1,使用map方法 var arr = [1,[2,[[3,4],5],6]]; function unid(arr){ var arr1 = (arr + '').split(',');//将数组转 ...
- 老毛子 Padavan 路由器固件开启教育网 IPv6 并实现IPv6转发
老毛子 Padavan 路由器固件开启教育网 IPv6 并实现IPv6转发 文章目录[隐藏] 一.开启opt环境 二.开启 WAN 端 IPv6 三.安装并运行 6relayd 四.开机自动安装并配置 ...
- echo 转义字符的使用
man echo 查看 echo 的使用文档 -n 不尾随换行符 -e 启用解释反斜杠的转义功能 -E 禁用解释反斜杠的转义功能(默认) --help 显示此帮助信息并退出 --version 显示版 ...
- Linux学习--- 宏定义下#、##的使用
# 字符串化 ## 连接符号 eg: #include <stdio.h> #define ABC(x) #x #define DAY(c) myday##c int main (){ ...