以下所有判断都是 true
直接复制代码到demo执行
console.log("%c%s",
"color: red; background: yellow; font-size: 24px;",
"原型");
console.log('-----------------------__proto__&prototype-----------------------');
function fun(a) { // 构造函数
this.a = a
}
var f = new fun() // 构造函数实例化 ----- f 就是 构造函数fun 的实例化对象
/**
* 每一个构造函数 都有一个属性 prototype(原型)
* 每一个对象 都有一个属性 __proto__
* 如果对象是由构造函数 new 出来的, 那么对象的 __proto__ 和 构造函数的 prototype 就是同一个东西
*/
console.log('fun.prototype:',fun.prototype);
console.log('new fun().__proto__:',f.__proto__);
console.log(fun.prototype === f.__proto__); // true
console.log('-----------------------------------------------------------------------------------------');
var obj = { a: 1 }
/**
* 如果这个对象不是构造函数 new 出来的, 是我们用 var 或者 let 创建的
* 那么这个对象的 __proto__ 默认和 Object.prototype 就是同一个东西
* var obj = {a: 1}
* 可以理解为 js 默认为我们做了一步处理 var obj = new Object({a: 1})
*/
var o = new Object()
console.log(obj.__proto__ === Object.prototype); // true
console.log(o.__proto__ === Object.prototype); // true
console.log(o.__proto__ === obj.__proto__); // true
/* 在任何地方用 var 或者 let 或者 const 都是一样的, 不会因为作用域的干系而改变 */
function foo(params) {
let obj = {a: 'foo'}
const o = {a: 'const'}
console.log('foo',obj.__proto__ === Object.prototype, 'let'); // true
console.log('foo',o.__proto__ === Object.prototype, 'const'); // true
}
foo()
console.log('-----------------------__proto__&prototype-----------------------');
console.log('-----------------------constructor-----------------------');
/**
* 构造函数的原型 prototype 中有一个属性 constructor
* constructor 就是构造函数本身
*/
console.log(fun.prototype.constructor === fun);
console.log(f.__proto__.constructor === fun);
console.log('-----------------------constructor-----------------------');
console.log("%c%s",
"color: red; background: yellow; font-size: 24px;",
"原型链");
console.log('-----------------------原型链-----------------------');
/**
* 难点 也是关键点
*
* 可以向上查找
* 向上查找:通过 fun 找到Object
*/
console.log(fun.prototype.__proto__);
console.log(Object.prototype);
console.log(fun.prototype.__proto__ === Object.prototype);
console.log(fun.prototype.__proto__.constructor);
console.log(fun.prototype.__proto__.constructor === Object);
console.log(fun.prototype.__proto__.constructor.keys({a: 1, b: 2}));
console.log('-----------------------原型链-----------------------');