JavaScript原型继承之基础机制分析
2023-06-13 09:14:30 时间
这一语言功能的本质依赖于JavaScript特有的原型链(prototypechain)模式。
所以严格意义上说,JavaScript是基于原型的面向对象语言。也就是说,每个实例对象都具有一个原型。对象从该原型中继承属性和方法。
1、构造函数
利用构造函数,可以简单地创建对象。构造函数内的this关键字指向实例对象本身:
复制代码代码如下:
所以严格意义上说,JavaScript是基于原型的面向对象语言。也就是说,每个实例对象都具有一个原型。对象从该原型中继承属性和方法。
1、构造函数
利用构造函数,可以简单地创建对象。构造函数内的this关键字指向实例对象本身:
functionPeople(name){
this.name=name;
}
使用new运算符和构造函数创建实例对象:
varpeople=newPeople("小明");
console.log(people.name);//小明
但如果创建了两个实例,这两个实例之间无法直接共享属性和方法:
varpeople1=newPeople("小明");
varpeople2=newPeople("小王");
people1.sex="male";
console.log(people2.sex);//undefined
也就是说对象一旦被实例化,其属性方法都独立存在,对某个属性的修改不会影响到其他实例。
2、Prototype
于是就有了prototype属性,这个属性是在生成实例对象时自动创建的。它本身又是一个对象,拥有能够在实例间共享的属性和方法。而实例本身的属性和方法,则包含在构造函数中。换句话说,构造函数内部的属性和方法,在经过实例化后都成为了本地的属性和方法,而原型(prototype)中的属性和方法在实例中只是一种引用,因此能够被多个实例共享。
还是刚才那个构造函数,现在为它增加prototype属性:
People.prototype.sex="female";
//或者写成People.prototype={sex:"female"};
console.log(people1.sex);//male
console.log(people2.sex);//female
People构造函数的prototype属性参数会直接影响到people1和people2两个实例。
但为什么people1.sex输出male呢?这是由于在JavaScript中,原型关系以递归形式存在。对象的原型也是一个对象,而原型的本身也可能具有一个原型。原型的最高层级是全局的Object对象。
这就是说,一旦people1.sex被设置为male后,它在原型中对应的值就无法被暴露出来。假如people1.sex本身没有值,才会从构造函数的prototype属性中读取,以此类推一级一级向上查找,直到Object对象。
注:使用“null”给对象赋值,可以销毁自定义对象,释放内存资源。
相关文章
- javascript 基础_JavaScript高级编程
- JavaScript——字符串对象
- JavaScript——DOM基础
- JavaScript 入门基础 / 概念介绍(一)
- JavaScript学习总结(十七)——Javascript原型链的原理详解编程语言
- JavaScript学习总结(一)——JavaScript基础详解编程语言
- javaScript基础练习题-下拉框制作详解编程语言
- 一段超强的javascript代码解密方法
- JavaScript基础问答二
- javascript面向对象编程基础:继承
- JavaScript创建随机数和随机图片
- javascript实现滚动效果代码整理
- JavaScript基础篇之运算符、语句(二)
- JavaScript高级程序设计(第3版)学习笔记2js基础语法
- javascript树形导航菜单实例代码
- Javascript多浏览器兼容总结(实战经验)
- 你未必知道的JavaScript和CSS交互的5种方法
- JavaScript极简入门教程(一):基础篇
- Javascript学习笔记之函数篇(四):arguments对象
- 浅谈Javascript变量作用域问题
- javascript构造函数方式定义对象