全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Javascript中的prototype与继承

通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性列表。javascript创建对象时采用了写时复制的理念。

只有构造器才具有prototype属性,原型链继承就是创建一个新的指针,指向构造器的prototype属性。

prototype属性之所以特别,是因为javascript时读取属性时的遍历机制决定的。本质上它就是一个普通的指针。

构造器包括:

1.Object
2.Function
3.Array
4.Date
5.String

下面我们来举一些例子吧

//每个function都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数
//注意Person.constructor 不等于 Person.prototype.constructor. Function实例自带constructor属性
functionPerson(name){
this.name = name;
};
Person.prototype.getName =function(){
returnthis.name;
};
var p =newPerson("ZhangSan");
console.log(Person.prototype.constructor===Person);// true
console.log(p.constructor===Person);// true ,这是因为p本身不包含constructor属性,所以这里其实调用的是Person.prototype.constructor

我们的目的是要表示

1. 表明Person继承自Animal

2. 表明p2是Person的实例

我们修改一下prototype属性的指向,让Person能获取Animal中的prototype属性中的方法。也就是Person继承自Animal(人是野兽) 

functionPerson(name){
this.name = name;
};
Person.prototype.getName =function(){
returnthis.name;
};
var p1 =newPerson("ZhangSan");
console.log(p.constructor===Person);// true
console.log(Person.prototype.constructor===Person);// true
functionAnimal(){}
Person.prototype =newAnimal();//之所以不采用Person.prototype = Animal.prototype,是因为new 还有其他功能,最后总结。
var p2 =newPerson("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;

这时p2.consturctor是对了,指向的是Person,表示p2是Person类的实例,但是新问题出现了。此时目的2达到了,目的1没达到。

目的1和目的2此时互相矛盾,是因为此时prototype表达了矛盾的两个意思,

1. 表示父类是谁

2. 作为自己实例的原型来复制

因此我们不能直接使用prototype属性来表示父类是谁,而是用getPrototypeOf()方法来知道父类是谁。 

Person.prototype =newAnimal();
Person.prototype.constructor=Person;
var p2 =newPerson("ZhangSan");
p2.constructor//显示 function Person() {}
Object.getPrototypeOf(Person.prototype).constructor//显示 function Animal() {}

就把这两个概念给分开了 ,其实通过使用 hasOwnProperty()方法,什么时候访问的是实例属性,什么时候访问的是原型属性就一清二楚了

new做了哪些事情?

当代码var p = new Person()执行时,new 做了如下几件事情:

创建一个空白对象

创建一个指向Person.prototype的指针

将这个对象通过this关键字传递到构造函数中并执行构造函数。

具体点来说,在下面这段代码中,

Person.prototype.getName =function(){}

如果我们通过

var person =newPerson();
其实类似于
var person =newObject();
person.getName =Person.prototype.getName;

因此通过person.getName()调用方法时,this指向的是这个新创建的对象,而不是prototype对象。

这其实在给现有函数加上新功能的情况下会用到,我们可以这么扩展现有的方法:

//function myFunc 的写法基本上等于 var myFunc = new Function();
function myFunc (){
}
myFunc =function(func){
  //可以在这里做点其他事情
returnfunction(){
     //可以在这里做点其他事情
return func.apply(this,arguments);
}
}(myFunc)

也可以在Function.prototype方法里直接通过this来访问上面代码的myFunc所指向的对象

function myFunc (){
}
if(!Function.prototype.extend){
Function.prototype.extend =function(){
var func =this;
returnfunction(){
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 =newAnimal();

为了避免这种情况,所以我们引入了一个中间函数。所以正确的做法应该是

Person.prototype =(funtion(){
   function F(){};
   F.prototype =Animal.prototype
   returnnew F();
})()

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# js  # prototype  # 继承  # Javascript中 关于prototype属性实现继承的原理图  # JavaScript类和继承 prototype属性  # js中继承的几种用法总结(apply  # call  # prototype)  # 深入了解javascript中的prototype与继承  # javascript prototype的深度探索不是原型继承那么简单  # JavaScript面向对象之Prototypes和继承  # Javascript 原型和继承(Prototypes and Inheritance)  # JavaScript不使用prototype和new实现继承机制  # JavaScript使用prototype原型实现的封装继承多态示例  # javascript基于prototype实现类似OOP继承的方法  # JS伪继承prototype实现方法示例  # JavaScript使用prototype属性实现继承操作示例  # 的是  # 是因为  # 创建一个  # 在这里  # 什么时候  # 达到了  # 做点  # 是一个  # 都有  # 也会  # 遍历  # 这段  # 我们可以  # 没办法  # 这两个  # 就把  # 人是  # 采用了  # 这种情况  # 分开了 


相关文章: 网站制作网站,深圳做网站哪家比较好?  如何正确选择百度移动适配建站域名?  建站VPS配置与SEO优化指南:关键词排名提升策略  昆明高端网站制作公司,昆明公租房申请网上登录入口?  建站之星上传入口如何快速找到?  公司门户网站制作流程,华为官网怎么做?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  定制建站如何定义?其核心优势是什么?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何快速搭建高效WAP手机网站?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  家具网站制作软件,家具厂怎么跑业务?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何选择香港主机高效搭建外贸独立站?  如何彻底卸载建站之星软件?  微课制作网站有哪些,微课网怎么进?  建站之星下载版如何获取与安装?  如何用PHP工具快速搭建高效网站?  如何用VPS主机快速搭建个人网站?  如何选购建站域名与空间?自助平台全解析  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  建站之星导航如何优化提升用户体验?  如何用y主机助手快速搭建网站?  b2c电商网站制作流程,b2c水平综合的电商平台?  济南网站制作的价格,历城一职专官方网站?  大同网页,大同瑞慈医院官网?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  如何在IIS中配置站点IP、端口及主机头?  小程序网站制作需要准备什么资料,如何制作小程序?  ,网页ppt怎么弄成自己的ppt?  再谈Python中的字符串与字符编码(推荐)  如何在局域网内绑定自建网站域名?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  专业公司网站制作公司,用什么语言做企业网站比较好?  如何制作算命网站,怎么注册算命网站?  宝塔建站助手安装配置与建站模板使用全流程解析  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  北京制作网站的公司,北京铁路集团官方网站?  如何配置FTP站点权限与安全设置?  h5在线制作网站电脑版下载,h5网页制作软件?  如何在搬瓦工VPS快速搭建网站?  如何快速搭建高效可靠的建站解决方案?  如何在阿里云域名上完成建站全流程?  如何快速配置高效服务器建站软件?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。