美文网首页
前端重学之路——重翻红宝书_原型原型链

前端重学之路——重翻红宝书_原型原型链

作者: 黑莓小宝闪电朵朵 | 来源:发表于2019-03-02 18:56 被阅读0次

最近要准备去面试了,再翻书时发现之前学知识跟盖了个豆腐渣工程一样,一推就倒,为了保证知识体系的完整及坚固。才有了这个学习系列,目的就是把自己学到的知识记录下来,以后翻翻看一看。这个系列会持续到觉得自己觉得前端学会了为止。
虽然说是重翻红宝书,但其实只是借鉴一下,还是要翻一翻大佬们的知识的。

今天来说一下原型和原型链,强烈推荐链接1。

先插入2个参考的学习链接
掘金-三张图搞懂JavaScript的原型对象与原型链
知乎-JavaScript 世界万物诞生记

【万物皆空】

原型的最原始是个null(这是知识点)


【万物皆对象】

JavaScript中的一切皆为对象

function Person(name) {
  this.name = name;
  this.play = function () {
    console.log(`${name}在玩球`);
  }
}
let a = new Person('LaoTian');
let b = new Person('XiaoTian');
typeof a.__proto__;       // object
typeof b.__proto__;       // object
typeof Person.prototype;  // object

【原型基本概念】

prototype每个函数都有一个prototype,可以理解它是一个共享仓库,仓库里有着可以共享的属性和方法。prototype默认是一个对象

// 字面创建
var n = {}
这也是构造一个新实例,但是是参考Object创建的。Object.__proto__ === null 最后我会贴张图,就能理解这一行了。
// 构造器创建非共享方法
function Person(name) {
  this.name = name;
  this.play = function () {
    console.log(`${name}在玩球`);
  }
}
let a = new Person('LaoTian');
let b = new Person('XiaoTian');
a.play === b.play // false
原因:在new时,会在内存中新开辟空间来分别存储a和b,所以两个play方法指向的其实是2个不同的位置。
// 构造器公共方法
function Person(name) {
  this.name = name;
}
Person.prototype.play = function() {
  console.log('玩球');
}
let a = new Person('LaoTian');
let b = new Person('XiaoTian');
a.play === b.play // true
原因:把玩这个方法写在了公共的方法里,所以说LaoTian和XiaoTian玩的是一个球

__proto__是一个对象拥有的内部属性,可以理解是个指路牌,指引你到达构造函数(原型对象)的共享仓库中去。

//__proto__指向它参照(原型)对象的prototype
function Person(name) {
  this.name = name;
}
Person.prototype.play = function() {
  console.log('玩球');
}
let a = new Person('LaoTian');
let b = new Person('XiaoTian');
a.__proto__ === Person.prototype; // ture 
b.__proto__ === Person.prototype; // true
a.__proto__ === b.__proto__;      // true


【通用认知】

对象(普通对象和函数对象)都有__proto__, 函数有prototype

大概的样子

通常来说,对象的__proto__指向函数的prototype,但是object.creat()除外。
对象是由函数生成的。

通常是这样的

【特殊注意】

1.当对象是object.creat()创建时是怎么指向的呢.

var a1 = {} 
var a2 = Object.create(a1);
特殊指向

2.Function的__proto__prototype关系

Function.__proto__ === Function.prototype; // true

【总结】

说了半天,解释了一下prototype__proto__好像也没说到底是什么是原型链,画个图吧。

var Fn = function(){};
var fnn = new Fn();
// 此图参考链接1,这个指向过程连成的线,就是原型链。
原型链

终极大佬图【就是因为看不懂这个图,才研究了半天】


终极大佬图

搞定,有疑问请评论,看到会及时回复。

相关文章

  • 前端重学之路——重翻红宝书_原型原型链

    最近要准备去面试了,再翻书时发现之前学知识跟盖了个豆腐渣工程一样,一推就倒,为了保证知识体系的完整及坚固。才有了这...

  • 再来看一次JS继承

    原型链继承 理解原型链的概念 用一张图来理解原型链再合适不过了。 总结概括JS红宝书上对原型链的概念:每个函数都有...

  • 【重学】原型链

    大纲:构造函数手写new命令原型链Object对象的相关方法 (x)易错点 constructor表示构造函数和原...

  • web前端面试之js继承与原型链(码动未来)

    web前端面试之js继承与原型链(码动未来) 3.2.1、JavaScript原型,原型链 ? 有什么特点? 每个...

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • js 原型链

    原型链是前端面试里一个经久不衰的问题了,自己也查阅了很多的资料,像红宝书、JavaScript忍者秘籍上都有对这一...

  • JavaScript继承

    来自红宝书的几种继承方式 1. 原型链继承 缺点: 原型的属性被所有实例共享 创建子类时不能向父类传参 2. 借用...

  • 面试题的总结

    进实验室前端的面试题总结 《1》知道javascript中的原型是什么吗?什么是原型链?能手写一个原型链继承的例子...

  • 原型、原型链

    (什么是原型、原型链?有什么作用) JavaScirpt深入之从原型到原型链 图解 Javascript 原型链 ...

  • 原型及原型链

    很多初学者在自学前端一些原型、原型链和原型链的查找搞不清楚,很容易学蒙圈,分享一些在爱前端学习时总结的知识希望可以...

网友评论

      本文标题:前端重学之路——重翻红宝书_原型原型链

      本文链接:https://www.haomeiwen.com/subject/ddtyuqtx.html