推荐回答
先举一个非常简单的例子,我有一个类叫Humans和另一个对象叫Merry另一个人,很明显Tom和Merry都是由Humans这一个类实例化之后得到的,然后可以把这个例子写成如下代码:functionHumans{this.foot=2;}Humans.prototype.ability=true;varTom=newHumans;varMerry=newHumans;alertTom.foot;//结果:2alertTom.ability;//结果:truealertMerry.foot;//结果:2alertMerry.ability;//结果:true以上是一个非常简单的面向对象的例子,相信都能看懂,如果尝试修改Tom的属性ability,则functionHumans{this.foot=2;}Humans.prototype.ability=true;varTom=newHumans;varMerry=newHumans;Tom.ability=false;alertTom.foot;//结果:2alertTom.ability;//结果:falsealertMerry.foot;//结果:2alertMerry.ability;//结果:true以上可以看出Tom的ability属性的值改变了,但并不影响Merry的ability属性的值,这正是我们想要的结果,也是面向对象的好处,由同一个类实例化得到的各个对象之间是互不干扰的;OK,接下来给ability换成object对象又如何?代码如下:functionHumans{this.foot=2;}Humans.prototype.ability={run:''100米/10秒'',jump:''3米''};varTom=newHumans;varMerry=newHumans;Tom.ability={run:''50米/10秒'',jump:''2米''};alertTom.ability.run;//结果:''50米/10秒''alertTom.ability.jump;//结果:''2米''alertMerry.ability.run;//结果:''100米/10秒''alertMerry.ability.jump;//结果:''3米''以上代码就是在原型链上使用了对象,但从以上代码可以看出Tom的ability属性的改变依然丝毫不会影响Merry的ability的属性,于是乎你会觉得这样的做法并无不妥,为什么说不能在原型链上使用对象?接下来的代码就会显得很不一样,并且可以完全表达出原型链上使用对象的危险性:functionHumans{this.foot=2;}Humans.prototype.ability={run:''100米/10秒'',jump:''3米''};varTom=newHumans;varMerry=newHumans;Tom.ability.run=''50米/10秒'';Tom.ability.jump=''2米'';alertTom.ability.run;//结果:''50米/10秒''alertTom.ability.jump;//结果:''2米''alertMerry.ability.run;//结果:''50米/10秒''alertMerry.ability.jump;//结果:''2米''没错,从以上代码的输出结果可以看出Tom的ability属性的改变影响到Merry的ability属性了,于是就可以明白在原型链上使用对象是非常危险的,很容易会打破实例化对象之间的相互独立性,这就是为什么不能在原型链上使用对象的原因?是的,但我想说的可不只如此,而是其中的原理,看完后面JS原型链的深层原理之后,相信你会完全明白。在以下第二部份解释JS原型链的深层原理之前,先来明确一个概念:原型链上的属性或方法都是被实例化对象共用的,正因如此,上面的Tom.ability.run=''50米/10秒'',改动了原型连上的ability才导致另一个对象Merry受影响,既然如此,你可能会问Tom.ability={}不也是改动了原型链上的ability吗,为什么Merry没有受影响?答案是Tom.ability={}并没有改动原型链上的ability属性,而是为Tom添加了一个自有属性ability,以后访问Tom.ability的时候不再需要访问原型链上的ability,而是访问其自有属性ability,这是就近原则。
齐有伟2019-11-05 20:36:38
提示您:回答为网友贡献,仅供参考。
其他回答
-
每个JavaScript对象内部都有一个指向其它对象的“指针”或者“引用“,并通过这种方式在对象之间建立了一种联系,形成了一种链式结构,我的理解这就是所谓的原型链。function F {} // F 是一个函数,函数也是对象,而且每个函数都有一个属性叫:"prototype"var o = new F; // F.prototype 就是 o 的原型对象console.logo.name;// 输出: undefinedF.prototype.name = "foo";console.logo.name;// 输出: foo// 上面这个例子是想说明:通过 new 在对象 o 与对象 F.prototype 之间建立了联系, 这个建立联系// 的方式有人叫 "原型继承" 。 当访问的对象属性不存在时,就会沿着原型链去查找。
齐杭丽2019-11-05 20:18:58
-
什么是作用域链,什么是原型链。作用域是针对变量的,比如我们创建了一个函数,函数里面又包含了一个函数,那么现在就有三个作用域全局作用域==>函数1作用域==>函数2作用域作用域的特点就是,先在自己的变量范围中查找,如果找不到,就会沿着作用域往上找。如:vara=1;functionb{ vara=2; functionc{ vara=3;console.loga;}c;}b;最后打印出来的是3,因为执行函数c查找,这个查找的过程就叫做原型链。Object==>构造函数1==>构造函数2就和css中的继承一样,如果自身没有定义就会继承父元素的样式。functiona{};a.prototype.name="追梦子";varb=newa;console.logb.name;//追梦子。
齐本会2019-11-05 20:03:22
-
原型链一直是个很抽象的概念,看不到,摸不着.随着最近对JavaScript进一步的学习,我对原型链有了一点理解,下面讲出来.基础知识在JavaScript中,一共有两种类型的值,原始值和对象值.每个对象都有一个内部属性=i;Foo.prototype=newFoo;}console.dirgetPrototypeChainnewFoo;最后的这个newFoo有多少个上层原型呢。
齐智国2019-11-05 20:02:14
相关问答
拉链的工作原理一般是用合力和分力的原理解释的。拉开拉链时,三角形的物体在两链间和拉链一起运动,手的拉力在三角形物体上产生了两个分力,在夹角很小的情况下,作用在尖角上的力很大,两分力向拉链施力且分力大于竖直向下的合力,即分力大于手的拉力,所以很难直接分离开的拉链很容易地被三角形分开。1、链牙有大小之分,齿形也各有不同,但同一拉链左右两边的链牙一定是大小相同的。拉链头造型富于变化,既可作拉手,又可作装饰拉链头还可作为保险,当拉链拉合后不会自动滑开。拉链的工作原理很简单,即两条拉链带通过拉头的作用,使其能随意的拉合或拉开,或者说是随意的锁住与打开.2、链牙的工作原理是,每一个齿都是一个小型的钩,能与挨着而相对的另一条布带上的一个小齿下面的孔眼相匹配。这种拉链很牢固,只有滑动器滑动使齿张开时才能拉开。扩展资料:平时用拉链应该注意的问题:对袋子上的拉链,当东西装的太多时,如果合闭拉链时硬拉,拉链受力太大,会使牙齿脱离带件,应把拉链的左右齿件拉近,使链头容易通过后,慢慢的合闭拉链。开合拉链时,有时链头咬住线带或布料而拉头拉不动:在这种情形下,如果强行拉动拉头,则会愈咬愈深,应该一方面把拉头倒退,一方面把布料解开。完全咬进去时,不要大力拉动拉头,请慢慢倒退拉头。拉链。