美文网首页
我对原型链的一些理解

我对原型链的一些理解

作者: silentsvv | 来源:发表于2018-04-21 03:11 被阅读0次

无聊就随便选一个话题来写吧。

原型链

其实原型链在我理解看来大概就是一段串联起来的关系链

var demoObj = {
    a: 2
}

console.log(demoObj.a) //输出2

//如果新对象里面不含有该属性, 会从 [prototype] 里面去寻找
var newObj = Object.create(demoObj); //新对象与demoObj建立起关系
console.log(newObj.a) //同样输出2, 因为newObj的 [prototype] 指向了demoObj

用函数会比较直观:

//创建父类
function Animal() {}

//添加属性
Animal.prototype.walk = function() {
    console.log('walk')
}

//创建子类
function Cat() {}

//引用父类属性
Cat.prototype = Animal.prototype;

var cat = new Cat();
cat.walk(); //输出'walk'

这样的好处就是类似Array之类原生的对象给我们提供了一些可用的方法,可以给子类继续引用使用。

但是如果原型链上存在相同属性的时候,可能会出现一些意想不到的问题。

var demoObj = {
    width: 10
};

//创建属性,设置不可写
Object.defineProperty(demoObj, 'height', {
 writable: false,
 enumerable: true,
 configurable: true,
 value: 12
};

var newObj =  Object.create(demoObj);
console.log(newObj.height); //输出12;
newObj.height = 22; //赋值
newObj.width = 33; //赋值
console.log(newObj.height, newObj.width); //12, 33

上面的例子,如果对象不存在属性,而原型链上该属性不可写,会发生以上的情况。 newObj.width 正常被赋值到了对象上, console.log(newObj) 会发现多了 width 的属性, 这是正常的现象(叫屏蔽属性)。但原型链上不可写的时候, 就触发不了了。而且若当原型链上寻找的设置有setter的话, 也会调用setter的方法, 也同样添加不了属性到 newObj 里面。


prototype的赋值也有些区别:

function parent() {
    this.a = 123;
}

parent.prototype.talk = function() {
    console.log(this.a)
}

function child1() {}
function child2() {}
function child3() {}

child1.prototype = parent.prototype;
child2.prototype = new parent();
child3.prototype = Object.create(parent.prototype);

var result1 = new child1();
var result2 = new child2();
var result3 = new child3();

result1.talk(); //输出undefined
result2.talk(); //输出123
result3.talk(); //输出undefined

child1.prototype.hello = function() {
    console.log('hello')
}

child3.prototype.goodbye = function() {
    console.log('goodbye')
}

result1.hello(); //输出'hello'
result2.hello(); //输出'hello'
result3.hello(); //输出'hello'

result1.goodbye(); //error: result1.goodbye is not a function
result2.goodbye(); //error: result2.goodbye is not a function
result3.goodbye(); //输出'goodbye'

child2 函数中new 的方法, 他会创建 this 对象, 所以也把 a 属性也赋值给了 child2.prototype 中。
child3child1 的最大区别在于一个是直接把 parent.prototype 的属性赋值给了 child1 , 另一个是使用 Object.create 创建了一个新的对象, 不会发生引用传值的问题, 引用传值会导致修改 child1.prototype 同时也会修改父元素的 prototype , 但是 Object.create 可能会导致 constructor 属性丢失, 重新设置即可。


结语

其实构造函数跟原型链一起更配。今天就写这么多吧。

相关文章

  • 深入JavaScript Day09 - 隐式原型、显示原型、n

    一、理解原型、原型链的一些要点【最重要的概念梳理,一定要理解】 1、对函数 function Foo(){} 调用...

  • 再来看一次JS继承

    原型链继承 理解原型链的概念 用一张图来理解原型链再合适不过了。 总结概括JS红宝书上对原型链的概念:每个函数都有...

  • 我对原型链的一些理解

    无聊就随便选一个话题来写吧。 原型链 其实原型链在我理解看来大概就是一段串联起来的关系链 用函数会比较直观: 这样...

  • 理解关于Function的原型链问题

    理解关于Function的原型链问题 关于Function的原型链问题的一些个人粗略理解,欢迎指正错误的地方 要理...

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • 来来来,通俗的理解一下原型,原型链......

    今天,在网上看到这个讲原型和原型链的通俗的分析,感觉对理解还是有帮助的,特此分享: 原型链理解起来有点绕了,网上资...

  • 对原型链的理解

    1,什么是原型链 简单来说就是对象和构造函数之间连接的一个链条 简称原型链 2,原型链的作用 可以通过原型链继承构...

  • 原型和原型链

    今天发现一张特别好的图(↑↑↑上图↑↑↑),对原型和原型链的理解特别直观友好。 原型和原型链 基础储备:每个 JS...

  • 对原型与原型链的理解

    原型对象 javascript语言是一种面向对象的语言,它没有"子类"和"父类"的概念,里面所有的数据类型都是对象...

  • 对原型与原型链的理解

    最开始想要直观的理解请直接参考阮一峰老师博客关于继承的讲解:http://www.ruanyifeng.com/b...

网友评论

      本文标题:我对原型链的一些理解

      本文链接:https://www.haomeiwen.com/subject/phetlftx.html