原型&原型链

以下所有判断都是 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('-----------------------原型链-----------------------');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值