关于JS 的原型和原型链
2024-09-01 23:53:06
原型
JavaScript规定,每一个函数都有一个prototype对象属性,指向另一个对象。prototype对象属性的所有属性和方法都会被构造函数的实例继承。这意味着我们可以把那些公用的属性和方法,直接定义在prototype对象属性上。
prototype就是调用构造函数所创建的实例对象的原型(proto)。js在创建对象的时候,都有一个叫做proto的属性,用于指向它的函数对象的原型对象prototype。
prototype可以让所有的对象实例共享它包含的属性和方法。
原型链
每一个对象都可以有一个原型,这可原型还可以有它自己的原型,以此类推,就形成了原型链。
查找一个对象的属性或方法的时候,如果这个对象中没有这个属性或者方法,那就会在这个对象的原型对象中去找,以此类推,直到原型链结束。
_proto_
_proto_
是原型链查询中实际用到的,指向构造函数的原型对象,他是对象独有的。对象._proto_ = 构造函数.prototype
。
在js中,万物皆是对象,函数也是对象。所以构造函数也会有_proto_
属性。
constructor
每个函数都有一个原型对象,该原型对象有一个constructor属性,指向创建对象的函数本身。
总结
1、只有函数才有prototype属性。
2、对象._proto_ = 构造函数.prototype
。
3、构造函数的prototype指向原型对象,原型对象的constructor指向构造函数。
使用
prototype最主要的用法就是将属性暴露成公用的。
function Person(name) {
this.name = name;
this.f = function() {
console.log("name is " + this.name)
}
}
var wang = new Person("wang");
var li = new Person("li");
console.log(wang.name); //wang
console.log(li.name); //li
console.log(wang.f === li.f); //false
虽然wang和li都有f属性,但是实例对象访问的都是自己的私有属性。
使用prototype将f方法变成公共属性:
function Person(name) {
this.name = name;
}
Person.prototype.f = function() {
console.log("name is " + this.name)
}
var wang = new Person("wang");
var li = new Person("li");
console.log(wang.name); //wang
console.log(li.name); //li
console.log(wang.f === li.f); //true
这就是prototype最大的作用:将属性或方法暴露为共有。
最新文章
- 转 : Hibernate懒加载深入分析
- C# xpath
- Swift编程语言简介
- easyui tree获取直接子节点而不获取孙子节点方法
- 【洛谷P1969】积木大赛
- 支持高并发的IIS Web服务器常用设置 II
- printf()函数
- CSS之页面添加标签
- JavaScript学习笔记(12)——JavaScript内置对象
- VS2015使用scanf报错解决方案
- JXOI 2017 简要题解
- 基于Token的身份认证 与 基于服务器的身份认证
- Confluence 6 服务器硬件要求指南
- BZOJ3251:树上三角形(乱搞)
- 火狐FireFox看视频不能全屏显示的问题
- struts2第三天——值栈
- Jquery ajax的参数格式化
- sql语句遇到错误: The used SELECT statements have a different number of columns :
- (数据科学学习手札33)基于Python的网络数据采集实战(1)
- MySQL中myisam和innodb的主键索引有什么区别?