jsjs的原型链链问题

hasOwnProperty是Object.prototype的一个方法它可是个好东西,他能判断一个对象是否包含自定义属性而不是js的原型链链上的属性因为hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找js的原型链链的函数。

只有 hasOwnProperty 可鉯给出正确和期望的结果这在遍历对象的属性时会很有用。 没有其它方法可以用来排除js的原型链链上的属性而不是定义在对象自身上嘚属性。

但有个恶心的地方是:JavaScript 不会保护 hasOwnProperty 被非法占用因此如果一个对象碰巧存在这个属性,就需要使用外部的 hasOwnProperty 函数来获取正确的结果

當检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法同时在使用 for in loop 遍历对象时,推荐总是使用 hasOwnProperty 方法这将会避免js的原型链对象扩展带来嘚干扰,我们来看一下例子:

我们没办法改变for in语句的行为所以想过滤结果就只能使用hasOwnProperty 方法,代码如下:

这个版本的代码是唯一正确的写法由于我们使用了 hasOwnProperty,所以这次只输出 moo如果不使用 hasOwnProperty,则这段代码在原生对象js的原型链(比如 Object.prototype)被扩展时可能会出错

总结:推荐使用 hasOwnProperty,鈈要对代码运行的环境做任何假设不要假设原生对象是否已经被扩展了。

JSjs的原型链与js的原型链链的剖析

JavaScript中萬物皆对象但对象之间也是有区另外,分为函数对象和普通对象

普通对象和函数对象 凡是通过new Function建立的对象都是函数对象,其他都是普通对象(通常通过Object建立)可以通过typeof来判断,由function创作发现出来的函数好比:

可能有人会问,不是通过new Function建立的对象才是函数对象吗注意丅面这两种写法是一样的,function f1(){}; 等价于 var f1 = new Function(); 写了这么多有些人可能不展示了,这跟js的原型链有什么关系呢

下面两句话很重要1、每一个函数对象嘟有一个prototype属性,可是普通对象是没有的;

2、每个对象都有一个名为_proto_的内部下性指向它所对应的构造函数的js的原型链对象,js的原型链链基於_proto_;

js的原型链对象 说到js的原型链对象我们先了解下构造函数是什么?构造函数与其他函数唯一的区别在于挪用体例不合任何函数只要通過new来挪用就可以作为构造函数,它是用来建立特定类型的对象

下面界说一个构造函数Animal:

通过new命令来生成一个Animal实例:

这里,构造函数Animal就是實例对象cat的js的原型链Animal里的this关键字就指的是cat这个对象。new出来的cat对象此时已经和Animal再无联系了也就是说每一个new出来的实例都有自己的属性和體例的副本,是自力的的!修改其中一个不会影响另一个

可是,我们希望构造函数中的species属性是一个共有属性那么此时用这样的体例,烸个实例中都有一个相同的species属性会造成资源极大的浪费!

那么js的原型链对象就即将登场了!给每一个构造函数都设置一个prototype属性,这个属性就指向js的原型链对象其实js的原型链对象就只是个普通对象,里面寄存着所有实例对象需要共享的属性和体例!所以我们把需要共享嘚放到js的原型链对象里,把那些不需要共享的属性和体例存在构造函数里!

那么上面的代码怎么修改呢

可以看出,修改prototype属性会影响它的所有实例的species的值

实例一旦建立出来就会自动引用prototype对象的属性和体例!所以实例对象的属性和体例一般分为两种:一种是自身的,一种是引用自prototype的

每今世码读取某个对象的某个属性的时候,城市执行一次搜索首先从对象实例自己开始,如果在实例中找到了该属性则返囙该属性的值,如果没有找到则顺着js的原型链链指针向上,到js的原型链对象中去找如果找到就返回该属性值。

js的原型链链 事实上js里唍全依靠"js的原型链链"(prototype chain)模式来实现继承。

__proto__:事实上就是js的原型链链指针

prototype:上面说到这个是指向js的原型链对象的

constructor:每一个js的原型链对象都包含┅个指向构造函数的指针就是constructor

继承 为了实现继承,__proto__会指向上一层的js的原型链对象而上一层的结构依然类似,那么就利用__proto__一直指向Object的js的原型链对象上!Object.prototype.__proto__ = null;暗示达到最顶端如此形成了js的原型链链继承。

下面有个图解很是经典可以手画几遍去理解,很是有效~

我要回帖

更多关于 js的原型链 的文章

 

随机推荐