新葡萄娱乐在线赌场:JS原型对象和原型链,浅谈JS原型对象和原型链

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

f一属于函数的扬言,最普遍的函数定义方式,f二实际上是3个匿名函数,把这些匿名函数赋值给了f2,属于函数表明式,f3不普遍,但也是一种函数对象。

Function是JS自带的对象,f一,f2在开创的时候,JS会自动通过new
Function()的艺术来营造这一个指标,因而,那四个指标都以经过new
Function()创建的。

在Javascript中创立对象有二种办法:对象字面量和利用new表明式,o一和o二的创造恰好对应了那两种格局,重点讲一下o3,
如若用Java和C#的思绪来领会的话,o三是f一的实例对象,o三和f1是千篇一律类型,至少小编原先这么认为,其实否则…

那就是说怎么了然吧? 一点也不细略,看o叁是否透过new Function发生的,
显著不是,既然不是函数对象,那正是常常对象 。

因而对函数对象和常常对象的粗略明白之后,大家再来驾驭一下Javascript中的原型和原型链:

在JS中,每当创设贰个函数对象f一时,该目标中都会停放壹些性格,当中囊括prototype和__proto__,
 prototype即原型对象,它记录着f壹的一对属性和方法。

内需留意的是,prototype
对f一是不可知的,也正是说,f一不会寻找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中的属性和办法。

想要知道f一是哪些把prototype留给“后代”,大家须要精通一下JS中的原型链,此时,JS中的
__proto__
入场了,那男人长的很奇幻,隐藏的也很深,以致于你日常见不到它,但它在壹般对象和函数对象中都留存,
它的成效正是保存父类的prototype对象,JS在经过new
表明式创立1个指标的时候,平时会把父类的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

新葡萄娱乐在线赌场:JS原型对象和原型链,浅谈JS原型对象和原型链。如图所示,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

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

浅谈JS原型对象和原型链,浅谈js原型

在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

f壹属于函数的扬言,最普遍的函数定义形式,f2事实上是3个匿名函数,把那么些匿名函数赋值给了f二,属于函数表明式,f3不普遍,但也是一种函数对象。

Function是JS自带的对象,f一,f二在开创的时候,JS会自动通过new
Function()的不二秘诀来塑造这几个目的,由此,那四个目的都是经过new
Function()创制的。

在Javascript中创立对象有三种办法:对象字面量和动用new表明式,o一和o2的创始恰好对应了那二种形式,重点讲一下o3,
假诺用Java和C#的思绪来驾驭的话,o三是f一的实例对象,o三和f壹是千篇壹律类型,至少小编原先这么认为,其实不然…

那正是说怎么掌握吧? 非常粗略,看o三是或不是透过new Function发生的,
显著不是,既然不是函数对象,那便是平常对象 。

因而对函数对象和普通对象的简短领悟之后,我们再来领悟一下Javascript中的原型和原型链:

在JS中,每当成立2个函数对象f一时,该目标中都会停放一些属性,当中包罗prototype和__proto__, 
prototype即原型对象,它记录着f一的有的属性和方法。

供给留意的是,prototype
对f一是不可知的,也正是说,f一不会寻找prototype中的属性和艺术。

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

那么,prototype有怎样用啊? 其实prototype的首要作用就是持续。
通俗一点讲,prototype中定义的属性和格局都以留下自个儿的“后代”用的,因而,子类完全能够访问prototype中的属性和办法。

想要知道f一是如何把prototype留给“后代”,我们供给驾驭一下JS中的原型链,此时,JS中的
__proto__
入场了,这男士长的很新奇,隐藏的也很深,以致于你时不时见不到它,但它在1般对象和函数对象中都设有,
它的效益正是保存父类的prototype对象,JS在经过new
表明式创造多个对象的时候,日常会把父类的prototype赋值给新目的的__proto__品质,那样,就形成了一代代传承…

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

当今大家掌握,obj中__proto__封存的是f的prototype,
那么f的prototype中的__proto__中保存的是哪些吧? 看下图:

新葡萄娱乐在线赌场 4

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

新葡萄娱乐在线赌场 5

obj对象具备那样三个原型链以往,当obj.foo执行时,obj会先找找自个儿是或不是有该属性,但不会寻找本人的prototype,当找不到foo时,obj就本着原型链依次去查找…

在上面的事例中,大家在f的prototype上定义了foo属性,那时obj就会在原型链上找到那几个性格并履行。 

最后,用几句话计算一下本文中涉及到的重点:

  • 原型链的多变真就是靠__proto__
    而非prototype,当JS引擎执行对象的章程时,先找找对象自作者是还是不是留存该方法,借使不存在,会在原型链上查找,但不会招来自个儿的prototype。
  • 一个目的的__proto__笔录着友好的原型链,决定了本人的数据类型,改变__proto__就等于改变目的的数据类型。
  • 函数的prototype不属于本人的原型链,它是子类创造的为主,决定了子类的数据类型,是接二连三子类原型链的大桥。
  • 在原型对象上定义方法和属性的指标是为着被子类继承和平运动用。

以上正是本文的全体内容,希望对我们的读书抱有帮助。

还不曾整理,百度时而~

貌似而言,通过new Function爆发的对象是函数对象,别的对象都以家常便饭对象。

你大概感兴趣的篇章:

  • javascript prototype 原型链
  • Javascript之旅 对象的原型链之由来
  • javascript学习笔记(玖)javascript中的原型(prototype)及原型链的接续情势
  • js原型链原理看图表达
  • JS原型对象通俗”唱法”
  • JS继承–原型链继承和类式继承
  • Javascript 学习笔记之 对象篇(二) : 原型对象
  • 深切掌握javascript构造函数和原型对象
  • Javascript中赢得对象的原型对象的法子小结

在Javascript中,万物皆对象,但指标也有分别,大概能够分成两类,即:普通对象(Object)和函数对象…

举例表明:

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,f贰在创制的时候,JS会自动通过new
Function()的格局来营造这几个指标,由此,这三个指标都以经过new
Function()创造的。

在Javascript中成立对象有两种办法:对象字面量和动用new说明式,o壹和o贰的始建恰好对应了那三种情势,重点讲一下o叁,
借使用Java和C#的思路来领会的话,o三是f一的实例对象,o三和f1是1致类型,至少小编原先这么认为,其实不然…

相关文章