js-关于原型链

原型

在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个prototype属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的prototype属性对应的值,在ES5中这个指针被称为对象的原型。

一般来说是不能获取到这个值的,但是现在浏览器中都实现了_proto_属性来访问这个属性,但是最好不要使用这个属性,因为它不是规范中规定的。ES5中新增了一个Object.getPrototypeOf()方法,可以通过这个方法来获取对象的原型。

原型链

当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是Object.prototype所以这就是新建的对象为什么能够使用toString()等方法的原因。

JavaScript对象是通过引用来传递的,创建的每个新对象实体中并没有一份属于自己的原型副本。当修改原型时,与之相关的对象也会继承这一改变。请添加图片描述

方法

对象实例可以通过constructor对象访问它的构造函数,但是如果修改了原型,使用这个属性就不能访问到它的构造函数。

原型对象中的值可以通过对象实例访问,但却不能通过对象实例修改。如果在实例中添加一个与实例原型对象同名的属性,那我们就在实例中创建该属性,这个实例属性会阻止我们访问原型对象中的那个属性,但不会修改那个属性。简单将该实例属性设为null并不能恢复访问原型对象中该属性的连接,若要恢复访问原型对象中的该属性,可以用delete操作符完全删除对象实例的该属性。

使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法只有在给定属性存在于对象实例中时,才会返回true。若要取得对象自身所有可枚举的实例属性,可以使用ES5的Object.keys() 方法。若要获取所有实例属性,无论是否可枚举,可以使用Object.getOwnPropertyNames() 方法。

修改、重写原型

function Person(name) {
	this.name = name
}
// 修改原型
Person.prototype.getName = function() {}
var p = new Person('hello')
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // true
// 重写原型
Person.prototype = {
	getName: function() {}
}
var p = new Person('hello')
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // false

修改原型的时候,p的构造函数就不再指向Person,因为直接给Person的原型对象直接用对象赋
值时,它的构造函数指向的了根构造函数Object,所以这时候 p.constructor === Object成立,p.constructor === Person不再成立。要想成立,就要用constructor指回来:

Person.prototype = {
	getName: function() {}
}
var p = new Person('hello')

p.constructor = Person

console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // true

原型链终点

由于 Object 是构造函数,原型链终点是 Object.prototype._proto_ ,而Object.prototype._proto_=== null // true,所以,原型链的终点是 null 。原型链上的所有原型都是对象,所有的对象最终都是由 Object 构造的,而 Object.prototype 的下一级是 Object.prototype._proto_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值