JavaScript,面向对象,原型、原型链(prototype chain),代码

2023-05-29 0 242

基本概念

蓝本(prototype):

JavaScript中,天地万物皆第一类,第一类能差别为:一般第一类和抒发式第一类。

Object ,Function是JavaScript便携式的抒发式第一类,每一第一类都有蓝本(null和undefined仅限),能把它认知为第一类的预设特性和方式。

蓝本链(prototype chain)

JavaScript中,每一第一类都有两个对准它的蓝本(prototype)第一类的外部镜像,那个原型第一类又有他们的蓝本,直至某一第一类的蓝本为null年末(也是无须有蓝本对准),共同组成那条链的最终劳特尔。此种二级二级的链内部结构就称作蓝本链(prototype chain)。

当企图出访两个第一类的特性时,它更为重要在该第一类上追踪,还会追踪该第一类的蓝本,和该第一类的蓝本的蓝本,据此一层层向下搜寻,直至找出两个英文名字相匹配的特性或抵达蓝本链的结尾。

__proto__和prototype

__proto__:隐式蓝本,prototype:隐式蓝本。

隐式蓝本(explicit prototype property):每两个抒发式在建立后单厢保有两个名叫:prototype的特性,那个特性对准抒发式的蓝本第一类;隐式蓝本用来同时实现如前所述蓝本的承继与特性的共享资源。

隐式蓝本(implicit prototype link):任一第一类都有两个内建特性[[prototype]],在ES5以后没国际标准的方式出访那个内建特性,然绝大多数浏览器都全力支持透过__proto__来出访,ES5了对那个内建特性国际标准的Get方式Object.getPrototypeOf()。隐式蓝本,形成蓝本链,反之亦然用作同时实现如前所述蓝本的承继。

以内基本概念用下列的代码事例来抒发,下列的下案充分体现出以内的基本概念。

标识符事例

<!DOCTYPE html> <html> <head> <meta charset=“utf-8”> <meta name=“description” content=“”> <meta name=“viewport” content=“width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no”> <script type=“text/javascript”> // Object:Object是两个抒发式第一类,Object的蓝本是两个Object第一类,它里面存在着一些第一类的方式和特性 console.log(“Object”,Object.prototype); // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …} console.log(“Object”,Object.prototype.prototype); // undefined // Array也是两个抒发式第一类,它的蓝本是Array.prototype,它里面存在着一些数组的方式和特性 console.log(“Array”,Array.prototype); // [constructor: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …] console.log(“Array”,Array.prototype.prototype);// undefined // Function也是两个抒发式第一类,但它有点特殊,它的蓝本是两个function空抒发式。 console.log(“Function”,Function.prototype);// ƒ () { [native code] } console.log(“Function”,Function.prototype.prototype); // undefined // 用new Object或者{}建立的第一类是一般第一类,它没prototype特性,只有__proto__特性,它对准Object.prototype。 var o = new Object(); console.log(“new Object()”,o.prototype); // undefined console.log(“new Object()”,o.__proto__); // {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …} // 自定义抒发式的蓝本是给它指定的内容。如果不指定,那它的蓝本是两个Object.prototype。 function XiaoFenDou(){ console.log(“小奋斗”); } console.log(“自定义抒发式”,XiaoFenDou.prototype); // {constructor: ƒ} XiaoFenDou.prototype = “小奋斗&&IT”; console.log(“自定义抒发式”,XiaoFenDou.prototype); // 小奋斗&&IT </script> </head> <body> </body> </html><!DOCTYPE html> <html> <head> <meta charset=“utf-8”> <meta name=“description” content=“”> <meta name=“viewport” content=“width=device-width;initial-scale=1.0;maximum-scale=1;user-scalable=no”> <script type=“text/javascript”> var obj = { a:1,b:2 }; // obj上没toString方式,但是Object上有 console.log(obj.toString()); // [object Object] console.log(obj.__proto__);// 报错,obj上没那个方式,Object上也没那个方式 // console.log(obj.push(“c”)); // Uncaught TypeError: obj.push is not a function console.log(obj.a); // 1 console.log(obj.c); //undefined </script> </head> <body> </body> </html>

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务