总结javascript基础概念(三):js对象原型链

主要问题:
一、构造函数和普通函数有区别么?什么区别?
二、prototype和__proto__有什么不一样?
三、instanceof的做用机制,为何有限制?
四、ES6的相关方法,Class继承原理?函数

3、对象与原型spa

(一)、数据类型
Js共有6种数据类型:prototype

5种基本数据类型 undefined,null,string,number,Boolean
1种复杂数据类型 Object

Object 数据类型能够分为两种:code

函数(包括各类原生、自定义的构造函数):
    Object(),Function(),Array(),Date(),,,
对象实例(由函数建立的) {,,},[,,]...

(二)、建立对象
<script>对象

var Person = function () { };
var p = new Person();

</script>
很简单的一段代码,咱们来看看这个new究竟作了什么?咱们能够把new的过程拆分红如下三步:
<1> var p={}; 也就是说,初始化一个对象p。
<2> p.__proto__=Person.prototype;
<3> Person.call(p); 也就是说构造p,也能够称之为初始化p。//执行构造函数的一步blog

说明:对象能够经过函数来建立。对象都是经过函数建立的。继承

clipboard.png

每一个函数都有一个prototype属性,指向一个对象,对象默认只有一个叫作constructor的属性,指向这个函数自己。ip

clipboard.png

Object是最顶级的构造函数,prototype对象里面,就有好几个其余属性。原型链

clipboard.png

每一个对象都有一个__proto__,可成为隐式原型。get

clipboard.png

自定义函数的prototype本质上就是普通对象实例,都是被Object建立,因此它的__proto__指向的就是Object.prototype。Object.prototype确实一个特例——它的__proto__指向的是null。

(三)、instanceof

<script>

function B(){};
var A = new B();
console.log(A instanceof B);

</script>

Instanceof运算符的第一个变量是一个对象,暂时称为A;第二个变量通常是一个函数,暂时称为B。
Instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,若是两条线能找到同一个引用,即同一个对象,那么就返回true。若是找到终点还未重合,则返回false。
因此instanceof 没法检测不一样iframe建立的对象实例。

(四)、ES6新方法,新特性
Object.setPrototypeOf(),Object.getPrototypeOf()。新增长几个方法直接操做对象的__proto__属性,实现对象之间的联系。
Class的对象语法糖,模仿面向对象的语法,勉强提供了JS中的类的概念。然而并无改变原型链的实质,只是更加隐藏的更深。

(五)、继承与委托与纯净面向对象的语言不一样,JS本质并无类和实例的概念。JS中一切皆对象(除了少数基本类型),是真正的面向“对象”。构造函数与普通函数并无区别,只是调用方式不一样。与竭力模仿面向对象的方式来使用JS,使得代码继承逻辑十分复杂抽象。相比之下,使用委托的思想,直接修改对象的__proto__属性指向,来访问委托对象上的属性和方法,在逻辑上更简洁直观。

相关文章
相关标签/搜索