基本概念
蓝本(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>