原型链和继承
搞清楚这个问题很简单,你只要记住一点:实例的 __proto__
指向对象的 prototype
。
换句话说,只要对象原型有的属性,那么他的实例就可以通过 __proto__
访问。例如:
Object.prototype.ygeeker = "Hello YGeeker";
function foo() {
return this.ygeeker;
}
console.log(foo.__proto__.ygeeker); // "Hello YGeeker"
console.log(foo.ygeeker); // "Hello YGeeker"
console.log(foo()); // "Hello YGeeker"
对象属性的访问顺序
首先记住一点:原型链的尽头(root)是 Object.prototype
。所有对象均从 Object.prototype
继承属性。
思考
有了原型链的知识,我们可以推出很多判断数组的方法:
instanceof
[].constructor === Array
Object.prototype.toString.call([]) === "[object Array]"
那么,请思考:如何在 JS 中判断变量类型?有多少种方法?
// Method 1
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
// Method 2
function getType2(value) {
if (value === null) return "Null";
if (value === undefined) return "Undefined";
return value.constructor.name;
}
// Method 3
function getType3(value) {
return typeof value;
}
// Method 4
function getType4(value) {
if (Array.isArray(value)) return "Array";
if (value instanceof Date) return "Date";
if (value instanceof RegExp) return "RegExp";
return typeof value;
}
提示
Date、RegExp 不属于基本类型,而是对 象类型。