Fork me on GitHub

JS原形链

https://www.jianshu.com/p/a4e1e7b6f4f8

https://www.cnblogs.com/shuiyi/p/5305435.html

JS中的对象分为两种,

1.普通对象obj
2.函数对象function

任何一个对象都有__proto__,但是只有函数对象有prototype

var o1 = {}; 
var o2 =new Object();
var o3 = new f1();

function f1(){}; 
var f2 = function(){};
var f3 = new Function('str','console.log(str)');

console.log(typeof Object); //function 
console.log(typeof Function); //function

console.log(typeof f1); //function 
console.log(typeof f2); //function 
console.log(typeof f3); //function

console.log(typeof o1); //object 
console.log(typeof o2); //object 
console.log(typeof o3); //object

我们可以new一个函数对象直接获取他的所有属性。

这些属性就归自己所有了。同时自己还可以拿到它的隐性属性。  

var Person = function(){
  this.name = "name";

  this.lala = "lala";
}

Person.prototype.lala = "lalala";//隐性属性

Person.prototype.xixi = "xixixi";//隐性属性

var Person1 = new Person();

1.普通对象person1
2.函数对象Person 

于是person1获取了Person的所有属性,归自己所有,同时还可以得到所有的Person的隐性属性,就是prototype的属性。

因为person1的隐形链 指向了Person的隐性属性。如果有多个级别,那么会一级一级向上面找去

个人理解:

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;

隐形链:__proto__

隐形属性(或方法):prototype

通过隐形链可以获取隐形属性。

举个例子:

Array.prototype,里面存放着Array的隐形属性。我们可以console.log(Array.prototype)打印出来

var b = [];

b是Array的小弟,b.constructor == Array;

那么b.__proto__ == Array.prototype;

于是b可以直接用Array的隐性属性。

再举个例子:

var  obj = {};

那么我们发现:obj.constuctor == Object;

既然obj是Object的小弟,那么:obj.__proto__ == Object.prototype;

console.log(Object.prototype);

发现好多隐藏方法,比如:toString,valueOf,都可以直接用了嘻嘻。

再回来看:


person1.constructor == Person;                 //Person的小弟是person1

person1.__proto__ == Person.prototype;  //所以小弟拥有Person的隐藏属性

Person.prototype.constructor == Person; //其实Person.prototype也是Person的小弟,一个特殊的小弟,可以理解为,函数对象的prototype属性,才是链接的对象。

 

posted @ 2018-02-06 10:03  森海轮回  阅读(109)  评论(0编辑  收藏  举报