JavaScript原型和原型链

原型

对象的 [[Prototype]] 属性(对象的原型)

在js中,对象(除null)都有一个原型的属性(隐式原型),可以通过 Object.getPrototypeOf()来获取,或者可以通过 __proto__ 来获取,因为不能直接通过对象点属性名的方式获取对应的属性,所以对象的原型我们一般称为隐式原型
对象点__proto__获取属性的方法是浏览器自己实现的,规范标准中没有此方法

// 字面量构建 也是在调用 Object的构造函数来构建
// var obj = {}
var obj = new Object()
// 查看
//console.log(Object.getPrototypeOf(obj))  
//console.log(obj.__proto__)

函数的prototype 属性(函数的原型)

在js中,函数都有一个prototype的属性(显式原型),可以通过Function.prototype来获取, 因为函数可以直接通过点属性名的方式获取到该属性,所以称为显式原型,一般称为原型

function foo() {}
console.log(foo.prototype)

函数也是对象,所以函数也有隐式原型

function foo() {}
console.log(foo.__proto__)

原型之间的关系

对象(函数)的隐式原型(__proto__)指向其构造函数的显示原型(prototype)

// var obj1 = { }  //字面量创建对象是调用构造函数创建对象的简写方式(语法糖) 
var obj1 = new Object() 
// 对象的隐式原型,指向其构造函数的原型
console.log(obj1.__proto__ === Object.prototype) // true

// obj1.__proto__  是个对象,所以可以继续获取他的__proto__
// Object 构造函数(习惯称为类)的prototype 也是个对象,所以可以继续获取他的__proto__
// Object 函数(类)的prototype的__proto__ 指向null
console.log(typeof(obj1.__proto__)) // object 
console.log(typeof(Object.prototype)) // object
console.log(obj1.__proto__.__proto__) // null
console.log(Object.prototype.__proto__) // null
// 函数的隐式原型 __proto__ 指向其构造函数的原型
// Object() 函数的构造函数是 Function
console.log(Object.__proto__) // { }
console.log(Object.__proto__ === Function.prototype) // true

Function的__proto__prototype是相同的,指向同一内存地址,Function是最顶层的函数

console.log(Function.__proto__ === Function.prototype) // true

原型对象

原型对象至少包含2个属性,constructor__proto__和原型上的其他属性

  • constructor 指向其构造函数
  • proto 指向其构造函数的原型
  • 其他属性,自己添加的属性
// 给 Object 原型添加 id 属性
Object.prototype.id = '001' 

原型链

MDN继承与原型链
实例对象,如果在自身上找不到相应的属性,就会向他的父类原型去寻找,父类找不继续向上寻找,直到找到Object原型终止,如此就形成了一个链条

var obj2 = { name: '张三'}
console.log(obj2.name) // 张三
console.log(obj2.id) // undefined
// 属性寻找流程
// name => 自身,找到返回
// id =》 自身 => Object.prototype(obj2.__proto__) => Object.prototype.__proto__(这个值是null,到达终点) =》 没有找到返回 undefined

Object.prototype.id = '001'
console.log(obj2.name) // 张三
console.log(obj2.id) // 001
// 属性寻找流程
// name => 自身,找到返回
// id =》 自身 => Object.prototype(obj2.__proto__) => Object.prototype.id =》 找到值,返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值