www.qjdy.com-奇迹赌场 > www.qjdy.com > JS核心系列:浅谈 原型对象和原型链

原标题:JS核心系列:浅谈 原型对象和原型链

浏览次数:79 时间:2019-11-29

JS主题种类:浅谈 原型对象和原型链

2016/03/01 · JavaScript · 2 评论 · 原型对象, 原型链

初稿出处: 一像素   

在Javascript中,万物皆对象,但目的也是有分别,大约能够分成两类,即:普通对象(Object)和函数对象(Function)。

诚如来说,通过new Function发生的目的是函数对象,别的对象都是何奇之有对象。

比方表达:

function f1(){ //todo } var f2 = function(){ //todo }; var f3 = new Function('x','console.log(x)'); var o1 = {}; var o2 = new Object(); var o3 = new f1(); console.log( typeof f1,//function typeof f2,//function typeof f3,//function typeof o1,//object typeof o2,//object typeof o3 //object ); >> function function function object object object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function f1(){
    //todo
}
var f2 = function(){
    //todo
};
var f3 = new Function('x','console.log(x)');
 
var o1 = {};
var o2 = new Object();
var o3 = new f1();
 
console.log(
    typeof f1,//function
    typeof f2,//function
    typeof f3,//function
    typeof o1,//object
    typeof o2,//object
    typeof o3 //object
);
>> function function function object object object

f1归属函数的申明,最常见的函数定义格局,f2实乃叁个无名函数,把那几个佚名函数赋值给了f2,归于函数表明式,f3不遍布,但也是意气风发种函数对象。

Function是JS自带的靶子,f1,f2在开立的时候,JS会自动通过new Function(卡塔尔(英语:State of Qatar)的点子来创设这几个指标,由此,这多个对象都是透过new Function(卡塔尔创制的。

在Javascript中创造对象有二种格局:对象字面量和选取new表明式,o1和o2的创始恰巧对应了那三种办法,重点讲一下o3, 假若用Java和C#的思绪来明白的话,o3是f1的实例对象,o3和f1是同样档次,最少本人从前这么以为,其实不然…

那么怎么精晓啊? 很简单,看o3是还是不是经过new Function爆发的, 分明不是,既然不是函数对象,这就是枯燥无味对象 。

透过对函数对象和平时对象的简约精通之后,大家再来精通一下Javascript中的原型和原型链:

在JS中,每当创设多少个函数对象f1 时,该目的中都会停放一些属性,个中饱含prototype和__proto__,  prototype即原型对象,它记录着f1的一些品质和措施。

亟需小心的是,prototype 对f1是不可以预知的,也正是说,f1不会找寻prototype中的属性和措施。

function f(){} f.prototype.foo = "abc"; console.log(f.foo); //undefined

1
2
3
function f(){}
f.prototype.foo = "abc";
console.log(f.foo); //undefined

那便是说,prototype有何样用吧? 其实prototype的重中之重功用就是世襲。 通俗一点讲,prototype中定义的习性和艺术都以留给自个儿的“后代”用的,由此,子类完全能够访谈prototype中的属性和方法。

想要知道f1是哪些把prototype留给“后代”,大家须要精晓一下JS中的原型链,这时,JS中的 __proto__ 上台了,这汉子长的很新奇,掩饰的也很深,以致于你时偶尔见不到它,但它在平时对象和函数对象中都设有, 它的意义正是保存父类的prototype对象,JS在通过new 表明式创立三个对象的时候,日常会把父类的prototype赋值给新指标的__proto__属性,那样,就变成了一代代承袭…

function f(){} f.prototype.foo = "abc"; var obj = new f(); console.log(obj.foo); //abc

1
2
3
4
function f(){}
f.prototype.foo = "abc";
var obj = new f();
console.log(obj.foo); //abc

前段时间大家了然,obj中__proto__封存的是f的prototype, 那么f的prototype中的__proto__中保存的是什么样吧? 看下图:

图片 1

如图所示,f.prototype的__proto__中保存的是Object.prototype,Object.prototype对象中也会有__proto__,而从出口结果看,Object.prototype.__proto__ 是null,表示obj对象原型链的终止。如下图所示:

图片 2

obj对象具备如此一个原型链现在,当obj.foo执行时,obj会先物色本身是不是有该属性,但不会招来自个儿的prototype,当找不到foo时,obj就本着原型链依次去查找…

在上头的例子中,我们在f的prototype上定义了foo属性,那时obj就能在原型链上找到这些个性并奉行。

 

最后,用几句话总括一下本文中涉及到的最首要:

  1. 原型链的变异真就是靠__proto__ 而非prototype,当JS引擎实践对象的点丑时,先找找对象自己是或不是留存该方法,假设空中楼阁,会在原型链上查找,但不会招来自个儿的prototype。
  2. 三个对象的__proto__记录着和谐的原型链,决定了我的数据类型,改动__proto__就约等于改动目的的数据类型。
  3. 函数的prototype不归属笔者的原型链,它是子类创立的基本,决定了子类的数据类型,是三番三次子类原型链的大桥。
  4. 在原型对象上定义方法和个性的指标是为了被子类世襲和选拔。

 

2 赞 17 收藏 2 评论

图片 3

本文由www.qjdy.com-奇迹赌场发布于www.qjdy.com,转载请注明出处:JS核心系列:浅谈 原型对象和原型链

关键词: mg电子游戏开户 JavaScript

上一篇:未经作者许可

下一篇:没有了