谈谈javascript中的prototype与继承
1.Object2.Function3.Array4.Date5.String
//每个function都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数
//注意Person.constructor 不等于 Person.prototype.constructor. Function实例自带constructor属性
function Person(name) {
this.name = name;
};
Person.prototype.getName = function() {
return this.name;
};
var p = new Person("ZhangSan"); console.log(Person.prototype.constructor === Person); // true
console.log(p.constructor === Person); // true ,这是因为p本身不包含constructor属性,所以这里其实调用的是Person.prototype.constructor
1.表明Person继承自Animal2. 表明p2是Person的实例
function Person(name) {
this.name = name;
};
Person.prototype.getName = function() {
return this.name;
};
var p1 = new Person("ZhangSan");
console.log(p.constructor === Person); // true
console.log(Person.prototype.constructor === Person); // true
function Animal(){ }
Person.prototype = new Animal();//之所以不采用Person.prototype = Animal.prototype,是因为new 还有其他功能,最后总结。
var p2 = new Person("ZhangSan");
//(p2 -> Person.prototype -> Animal.prototype, 所以p2.constructor其实就是Animal.prototype.constructor)
console.log(p2.constructor === Person); // 输出为false ,但我们的本意是要这里为true的,表明p2是Person的实例。此时目的1达到了,目的2没达到。
Person.prototype = new Animal();Person.prototype.constructor = Person;
1表示父类是谁2作为自己实例的原型来复制
Person.prototype = new Animal();
Person.prototype.constructor = Person;
var p2 = new Person("ZhangSan");
p2.constructor //显示 function Person() {}
Object.getPrototypeOf(Person.prototype).constructor //显示 function Animal() {}
当代码var p = new Person()执行时,new 做了如下几件事情:
创建一个空白对象
创建一个指向Person.prototype的指针
将这个对象通过this关键字传递到构造函数中并执行构造函数。
具体点来说,在下面这段代码中,
Person.prototype.getName = function() {
}
如果我们通过
var person = new Person(); 其实类似于 var person = new Object(); person.getName = Person.prototype.getName;
因此通过person.getName()调用方法时,this指向的是这个新创建的对象,而不是prototype对象。
这其实在给现有函数加上新功能的情况下会用到,我们可以这么扩展现有的方法:
//function myFunc 的写法基本上等于 var myFunc = new Function();
function myFunc () {
}
myFunc = function(func)
也可以在Function.prototype方法里直接通过this来访问上面代码的myFunc所指向的对象
function myFunc () {
}
if (!Function.prototype.extend) {
Function.prototype.extend = function(){
var func = this;
return function(){
func.apply(this,arguments);
}
}
};
var myFunc = myFunc.extend();
最后总结一下:
如果采用Person.prototype = Animal.prototype来表示Person继承自Animal, instanceof方法也同样会显示p也是Animal的实例,返回为true.
之所以不采用此方法,是因为下面两个原因:
1.new 创建了一个新对象,这样就避免了设置Person.prototype.constructor = Person 的时候也会导致Animal.prototype.constructor的值变为Person,而是动态给这个新创建的对象一个constructor实例属性。这样实例上的属性constructor就覆盖了Animal.prototype.constructor,这样Person.prototype.constructor和Animal.prototype.contructor就分开了。
2.Animal自身的this对象的属性没办法传递给Person
但是像下面这样直接调用构造函数又可能失败,或者产生其他影响。
Person.prototype = new Animal();
为了避免这种情况,所以我们引入了一个中间函数。所以正确的做法应该是
Person.prototype = (funtion(){
function F(){};
F.prototype = Animal.prototype
return new F();
})()
谈谈javascript中的prototype与继承的更多相关文章
- Javascript中的prototype与继承
通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表.javascript创建对象时采用了写时复制的理念. 只有构造器才具有prototype属性,原型链继承 ...
- 【转】JavaScript中的原型和继承
请在此暂时忘记之前学到的面向对象的一切知识.这里只需要考虑赛车的情况.是的,就是赛车. 最近我正在观看 24 Hours of Le Mans ,这是法国流行的一项赛事.最快的车被称为 Le Mans ...
- javascript中创建对象和实现继承
# oo ##创建对象 1. 原型.构造函数.实例之间的关系 * 原型的construct->构造函数:调用isPrototypeOf(obj)方法可以判定和实例的关系: * 构造函数的pro ...
- JavaScript中的prototype和__proto__细致解析
最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的 ...
- JavaScript中Object.prototype.toString方法的原理
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...
- 谈谈javascript中原型继承
什么是继承?拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的 如何实现继承的方式 原型继承 混入继承 经典继承 1. 混入继承 由于一个对象可以继承自任意的对象,即:o可以继承自对象o ...
- javascript中的原型和继承
javascript一直是初学者口中的难点,甚至一些有些许工作经验的人也不太明白其中的原理,而我就是那个初学者,前段时间在阮一峰老师的博客上看了一篇文章<javascript继承机制的设计思想& ...
- javascript中的对象之间继承关系
相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...
- JavaScript中的类式继承和原型式继承
最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
随机推荐
- php_mvc实现步骤五
5.match_controller 控制器层典型实现 控制器类 依据功能的相关性,将一系列相关的功能,使用一个控制器类来处理,而该控制器的每个方法,就对因某个功能. 注意:控制器是按照功能划分的.( ...
- docker+k8s基础篇一
Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...
- [转帖]推荐一款比 Find 快 10 倍的搜索工具 FD
推荐一款比 Find 快 10 倍的搜索工具 FD https://www.hi-linux.com/posts/15017.html 试了下 很好用呢. Posted by Mike on 2018 ...
- [转帖]Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞
Chrome用户请尽快更新:谷歌发现两个严重的零日漏洞 https://news.cnblogs.com/n/647075/ 强烈建议:Chrome 用户请尽快升级浏览器!在谷歌今天发布的紧急补丁程序 ...
- 使用 Issue 管理软件项目详解
文章来源:http://www.ruanyifeng.com/blog/2017/08/issue.html 软件开发(尤其是商业软件)离不开项目管理,Issue 是最通用的管理工具之一. 本文介绍 ...
- 【C#】上机实验六
. 定义Car类,练习Lambda表达式拍序 ()Car类中包含两个字段:name和price: ()Car类中包含相应的属性.构造函数及ToString方法: ()在Main方法中定义Car数组,并 ...
- windows 查看端口占用以及解决办法
windows 下查看所有端口程序1 netstat -ano 查看所有的端口占用情况2 netstat -ano|findstr "443" 查看端口为443的程序占用情况3 t ...
- 面试总结 转发(CSDN 博主)
1 https://blog.csdn.net/jackfrued/article/details/44921941 2 https://blog.csdn.net/jackfrued/article ...
- 5_PHP数组_3_数组处理函数及其应用_4_数组和变量间的转换函数
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组和变量间的转换函数 1. list() 语言结构 程序: <?php $info = array('co ...
- Ruby开发小记
基础点 1.log打印 puts "Hello!" 2.拼接字符 value1 = "today" value2 = "#{value1} is Th ...