最详尽的 JS 原型与原型链终极详解记录

2018-12-16  本文已影响0人  安静的牛蛙

该文章来自于最详尽的 JS 原型与原型链终极详解,没有「可能是」的学习总结

一:对象的分类

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

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
console.log(typeof o4); //object

二:prototype 和 __proto__

(普通对象).__proto__ == (创建它的函数对象).prototype
(函数对象).__proto__ == Function.prototype  // 函数对象都由 new Function()创建

FunctionObject都是函数对象,都是通过new Function()创建,所以

Function.__proto__ == Function.prototype
Object.__proto__ == Function.prototype
typeof A.prototype == 'Object'  // A

Function除外,因为Function的新建实例还是一个函数对象,所以

typeof Function.prototype == 'function'

但是该prototype是一个特殊的函数对象。它没有prototype,另外,它的__proto__指向了Object.prototype,而不是Function的prototype,即

typeof Function.prototype == 'function'
Function.prototype.__proto__ == Object.prototype
function f1() {}
f1.prototype.constructor == f1
Function.prototype.constructor == Function

三:原型链继承

JS中的原生继承是通过原型链完成的。以下面的代码为例子

var Person = function(name){
  this.name = name; 
};
Person.prototype.getName = function(){
  return this.name;  // tip: 当函数执行时这个 this 指的是谁?
}
var person1 = new person('Mick');
person1.getName(); //Mick
person1.name; //Mick
person1.toString(); // [object Object]

四:JS中原型链继承链路

Function.__proto__ == Function.prototype
Function.prototype.__proto__ == Object.prototype
Object.prototype.__proto__ == null
Object.__proto__ == Function.prototype
Function.prototype.__proto__ == Object.prototype
Object.prototype.__proto__ == null
function f1() {}
f1.__proto__ == Function.prototype
Function.prototype.__proto__ == Object.prototype
Object.prototype.__proto__ == null
function f1() {}
o1 = new f1()
o1.__proto__ = f1.prototype
f1.prototype__proto__ == Object.prototype
Object.prototype.__proto__ == null
function f1() {}
function f2() {} // 设定f2继承自f1,具体如何实现继承,可以查看另一篇文章
o2 = new f2()
o2.__proto__ = f2.prototype
f2.prototype.__proto__ = f1.prototype
f1.prototype__proto__ == Object.prototype
Object.prototype.__proto__ == null

五:总结

六:Function和Object自带属性

参考链接

https://www.jianshu.com/p/dee9f8b14771
https://www.jianshu.com/p/652991a67186
https://www.jianshu.com/p/a4e1e7b6f4f8

上一篇 下一篇

猜你喜欢

热点阅读