JavaScript 原型和原型链

时间:2020-04-07 00:35:23   收藏:0   阅读:61

就在我第100次以为我弄懂了原型和原型链,第101次又被面试官问到自闭。

先说结论:原型链是基于__proto__形成的,继承是通过prototype(原型)实现的。

那么,什么是prototype,什么是__proto__,两者关系又是怎样的呢?

prototype

proto

proto & prototype

那么,普通函数、构造函数、Object、Function之间到底有什么关系呢?它们的__proto__prototype之间的指向又是怎样的呢?

// 定义函数 a,a的本质是由Function函数构造出的js对象
function a(){}

// 对象的__proto__属性指向其构造函数的prototype属性,下面为true
console.log(a.__proto__ === Function.prototype) // true

// 所有的函数都是Function生成的,Object构造函数和Function自己也不例外,它们的__proto__属性都指向Function.prototype,所以下面两个为true
console.log(Object.__proto__ === Function.prototype); // true
console.log(Function.__proto__ === Function.prototype); // true

// Function.prototype是一个对象,它的__proto__属性指向原型链的最顶端Object.prototype
console.log(Function.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true

看下面图会更加清晰一些
技术分享图片

完整的原型关系图
技术分享图片

弄懂了了这些,再看下面的题目,就是 so easy~

题目1

var A = function() {};
A.prototype.n = 1;
var b = new A();
A.prototype = {
  n: 2,
  m: 3
}
var c = new A();

console.log(b.n); // 1
console.log(b.m); // undefined

console.log(c.n); // 2
console.log(c.m); // 3

题目2

var F = function() {};

Object.prototype.a = function() {
  console.log(‘a‘);
};

Function.prototype.b = function() {
  console.log(‘b‘);
}

var f = new F();

f.a(); // a
f.b(); // f.b is not a function

F.a(); // a
F.b(); // b

题目3

function Person(name) {
    this.name = name
}
let p = new Person(‘Tom‘);

p.__proto__等于什么?---> Person.prototype

Person.__proto__等于什么?---> Function.prototype

题目4

var foo = {},
    F = function(){};
Object.prototype.a = ‘value a‘;
Function.prototype.b = ‘value b‘;

console.log(foo.a); // value a
console.log(foo.b); // undefined

console.log(F.a); // value a
console.log(F.b); // value b

原文:https://www.cnblogs.com/dora-zc/p/12650264.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!