谈谈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_MySQL高并发加锁事务处理
1.背景: 现在有这样的需求,插入数据时,判断test表有无username为‘mraz’的数据,无则插入,有则提示“已插入”,目的就是想只插入一条username为‘mraz’的记录. 2.一般程序 ...
- [转帖]Linux企业运维人员最常用150个命令汇总
Linux企业运维人员最常用150个命令汇总 https://clsn.io/clsn/lx998.html 基本上都用过了. 命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的 ...
- Wireshark 抓包过滤器学习
Wireshark 抓包过滤器学习 wireshark中,分为两种过滤器:捕获过滤器 和 显示过滤器 捕获过滤器 是指wireshark一开始在抓包时,就确定要抓取哪些类型的包:对于不需要的,不进行抓 ...
- python-tkinter使用方法——转载(二)
转载URL:https://www.cnblogs.com/yudanqu/p/9467803.html Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包 ...
- 函数的学习2——返回值&传递列表——参考Python编程从入门到实践
返回值 函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值.函数的返回值被称为返回值. 1. 简单的返回值 def get_formatted_name(first_name, l ...
- zap+日志分级分文件+按时间切割日志整合demo
实现功能 info debug 级别的日志输出到 /path/log/demo.log warn error .... 级别的日志输出到 /path/log/demo_error.lo ...
- jquery 根据后台传递过来的三维数组动态生成三级菜单
根据后台传递过来的三维数组动态生成三级菜单 <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- 小程序发起get请求====post请求
- Spring Cloud Alibaba学习笔记(19) - Spring Cloud Gateway 自定义过滤器工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的内置过滤器工厂,若Spring Cloud Gateway内置的过滤器工厂无法满足我们的业务需求,那么此时就需要自定义自己的过 ...
- CLASSPATH 环境变量设置
当 JVM 运行时,如果设置了 CLASSPATH 变量,那么 JVM 会到该目录下寻找 java 类文件 该变量配置的方式不同,寻找顺序也不同 在我的 D:\tmp\java\quickstart\ ...