马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

js原型链的看法

[复制链接]
查看2080 | 回复0 | 2019-8-13 21:59:10 | 显示全部楼层 |阅读模式
原型链

对象

对象:
1,函数对象:有function创造出来的函数
2,平凡对象:除开函数对象之外的对象,都是平凡对象
**即平凡对象obj是构造函数Object的一个实例,因此:
obj.__proto__ === Object.prototype**
  1. //平凡对象var obj = {}var obj1 = new Object()console.log(obj.__proto__ === obj1.__proto__); //trueconsole.log(obj.__proto__ === Object.prototype); //true
复制代码
但凡通过new Function()创建 的对象都是函数对象,其他都是平凡对象
**注意: 所有对象都有__proto__属性,只有函数对象才有prototype属性**
3,原型对象:prototype属性也叫原型对象,主要为了实现继承
**指针__proto__: js中,万物皆对象!所有obj都具有proto属性(null和undefined除外),而且指向创造obj对象的函数对象(生成实例的构造函数)的prototype属性:**
  1. function Person(name) {this.name = name;}function Mother() {}Mother.prototype = { //Mother的原型age: 18,home: ['家里蹲']}Person.prototype = new Mother() //Person的原型为Mother
复制代码
Person 构造函数的原型对象 是 Mother ()。相当于原型(prototype)是妈妈,Person现在是儿子。
  1. let a = new Person()let b = new Person('猪脑壳子')console.log(a.age); // 18console.log(b.name, b.home); //猪脑壳子 ["家里蹲"]console.log(a.__proto__); //__proto__: age: 18 home: Array(1) 0: "家里蹲"length: 1
复制代码
**在a和b的实例中,__proto__属性,指向的都是它们的构造函数Person对象的prototype属性,所对应的对象也就是Mother()**
**一个构造函数对象的原型(prototype),就相当于他妈,这个构造函数对象的实例,就相当于他妈差别的孩子,而每个实例中的__proto__属性,就指向它们共同的妈妈!也就是构造函数对象的prototype属性**
****当我们输入 b.name 的时候,原型链的搜索机制是先在实例中搜索相应的值,找不到就通过它__proto__指针,在原型中找,还找不到就再往上一级原型中搜索……一直到了原型链的终点(就是js自带的Object,它的原型比较特殊,为null ),就是到null还没找到的话,就返回一个 undefined。****
构造器constructor : 每一个对象中的constructor 属性返回创建此对象的函数对象的引用;例如:
  1. function Cat(name,color) {this.name = name;this.color =color;}var cat1 = new Cat('小黑','白色')console.log(cat1.constructor === Cat) //trueconsole.log(cat1); //Cat {name: "小黑", color: "白色"}
复制代码
在默认情况下,所有的原型对象都会自动得到一个constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性地点的函数(Person)
上面这句话有点拗口,我们「翻译」一下:A 有一个默认的 constructor 属性,这个属性是一个指针,指向 Person。即:
  1. Person.prototype.constructor === Person
复制代码
实例的构造函数属性(constructor)指向构造函数 :person1.constructor == Person
person1 为什么有 constructor 属性?那是因为 person1 是 Person 的实例。
那 Person.prototype 为什么有 constructor 属性??同理, Person.prototype (你把它想象成 A) 也是Person 的实例。
也就是在 Person 创建的时候,创建了一个它的实例对象并赋值给它的 prototype,基本过程如下:
  1. var A = new Person();Person.prototype = A;
复制代码
结论:原型对象(Person.prototype)是 构造函数(Person)的一个实例。

来源:https://www.cnblogs.com/wangqingjiu/archive/2019/08/13/11348595.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则