每日一题(五三)function fn(){}const a={},b=Object.prototypeconsole.log(a.prototype===b)console.(Object.getP

写出执行结果,并解释为什么

function fn(){};
const a = {}, b = Object.prototype;
console.log(a.prototype === b);
console.log(Object.getPrototypeOf(a) === b);
console.log(fn.prototype === Object.getPrototypeOf(fn));

答案:

false
true
false

知识点:

1、__proto__(隐式原型) 和 prototype (显式原型)的关系:

1> 显式原型:每一个函数在创建之后都会拥有一个名为  prototype 的属性,这个属性指向函数的原型对象。(需要注意的是,通过 Function.prototype.bind 方法构造出来的函数是个例外,它没有 prototype 属性)

2> 隐式原型:JavaScript 中任意对象都有一个内置属性 [[prototype]] ,但是大多数浏览器都支持通过 __proto__ 来访问。ES5 中有了对于这个内置属性标准的 Get 方法: Object.getPrototypeOf()。(注意:Object.prototype 这个对象是个例外,它的 __proto__ 属性值为 null)

3> 二者的关系:隐式原型指向创建这个对象的函数(constructor)的 prototype。

2、作用:

1> 显式原型的作用:用来实现基于原型的继承与属性的共享。

2> 隐式原型的作用:构成原型链,同样用于实现基于原型的继承。举个栗子:当我们访问 obj 这个对象中的 x 属性时,如果 obj 中找不到,那么就会沿着 __proto__ 依次查找。

3、__proto__ 的指向:

__proto__ 指向如何判断呢?根据 ECMA 定义:“to the value of its constructor's 'prototype'”,即指向创建这个对象的函数的 prototype (显式原型)。

所以关键的点在于找到创建这个对象的构造函数,接下来就来看一下 JS 中对象被创建的方式,看起来有三种:1.对象字面量方式,2.new 方式,3.ES5 中的 Object.create() 方式。但是本质上只有一种方式,也就是通过 new 来创建。为什么这么说呢,首先字面量的方式是一种为了开发人员更方便创建对象的一个语法糖,本质就是 var o =  new Object(); o.xx = xx 。

解析:

1. a.prototype === b  =>false

prototype 属性是只有函数才特有的属性,当你创建一个函数时,js 会自动为这个函数加上 prototype 属性,值是一个空对象。而实例对象是没有 prototype 属性的。所以 a.prototype 是 undefined ,第一个结果为 false。

2. Object.getPrototypeOf(a) === b  =>true

首先要明确对象和构造函数的关系,对象在创建的时候,其 __proto__ 会指向其构造函数的 prototype 属性。Object 实际上是一个构造函数(typeof Object => "function"),使用字面量创建对象和使用 a = new Object() 创建对象是一样的,所以 a.__proto__  = Object.prototype ,所以,Object.getPrototypeOf(a) 与 a.__proto__ 是一样的,结果为 true。

3. fn.prototype === Object.getPrototypeOf(fn) =>false

fn.prototype 和 Object.getPrototypeOf(fn) 说的不是一回事,fn.prototype 是使用 new 创建的 fn 的实例的原型:fn.prototype === Object.getPrototypeOf(new fn());//true

Object.getPrototypeOf(fn) 是 fn 函数的原型:Object.getPrototypeOf(fn) === Function.prototype ; //true

所以答案为 false

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/106502113