JS原型相关

我的对于原型链的相关东西一直处于一个很混乱的状态,一直没找时间梳理,春节之际给本身放个假,也整理下本身想看的东西bash

相关书籍《你不知道的JavaScript上卷》函数

  • for...in会遍历原型链上全部属性

属性的设置和屏蔽

假设有一个对象myObj,执行语句ui

myObj.foo = "a";
复制代码

可能出现的几种状况:spa

  • 若是myObj的原型链和myObj都没有这个属性,则会直接添加到myObj上
  • 若是myObj有改属性,则会修改已有属性
  • 若是foo存在在原型链上,而且没有被标记为只读,则会直接在myObj上添加一个foo,他会屏蔽原型链上的foo
  • 若是foo存在在原型链上,而且被标记为只读,则没法修改该属性,也没法赋值
  • 若是foo存在在原型链上且是一个setter,则会调用,不会添加到myObj上

"类"函数

常常看到这种写法prototype

function Foo () {};
var a = new Foo();
复制代码

这里执行new的这一步实际是将a的原型链指向Foo.prototype,注意这里比较坑的是new的时候并非复制Foo.prototype而是直接指向,因此若是new多个对象,他们全部的原型链都指向同一个对象!code

"构造函数"

function Foo () {};
var a = new Foo();
Foo.prototype.constructor === Foo; //true
a.constructor === Foo;
复制代码

使用Object.create()继承

Object.create()会建立一个新对象,并把该对象的原型链关联到指定对象上;对象

// Object.create()的polyfill代码
if (!Object.create) {
    Object.create = function (obj) {
        function F () {}
        F.prototype = obj;
        return new Foo();
    }
}
复制代码

检查“类”的关系

  • 经过instanceof
function Foo () {}
Foo.prototype.blah = 'a';
var a = new Foo();
a instanceof Foo //true;
复制代码

这里判断的是a的原型链是否有指向Foo.prototype;继承

几个方法

  • Object.isPrototypeOf();
  • Object.getPrototypeOf();
相关文章
相关标签/搜索