美文网首页
js原型和原型链

js原型和原型链

作者: 练习时长2年半的个人练习生 | 来源:发表于2020-04-11 12:10 被阅读0次

什么是原型 .什么是原型链?

  • 原型:对象上的内置属性[[prototype]]
  • 原型链:在对象上访问某个属性,如果对象本身没有就继续在它的[[prototype]] 上找 ,如果找不到继续在 [[prototype]]的[[prototype]]上找.....直到 Object.prototype

传统面向类语言的实例化

类实例化就意味着把类的行为复制到物理对象.

js中的实例化

在js中并没有真正类的概念,实例对象 是通过构造函数调用的.它并没有生成一个完全独立的实例对象.所有的实例都会有原型联系。

    function Fn(){} 
    let f1 = new Fn();
    let f2  = new Fn();

上面通过函数的new调用,实际上只是生成了两个[[prototype]]都指向Fn.prototype 的实例

原型的作用

在js设计中.原型的主要作用是实现对象的相互关联..

相关方法
  • Object.getPrototypeOf 获取对象的[[prototype]]
    function Fn(){}
    let f1 = new Fn();
    console.log(Object.getPrototypeOf(f1) == Fn.prototype)//true
  • Object.create(obj) 创建并返回一个新的对象,使用现有对象 给新对象提供[[prototype]]
  let obj ={
        name:'obj',
        say(){
            console.log(this.name)
        }
    }
    let new_obj = Object.create(obj)
    console.log(new_obj.__proto__ === obj)
  • obj instanceof Fn 运算符用来检查 函数的prototype是否出现在对象的整条原型链上
    let Fn =function(){}
    let f = new Fn();
    let Mo = function(){}
    console.log(f instanceof Fn) //true
    console.log(f instanceof Mo)  //false

  • 普通对象的实例:只有__proto _

  • 所有(非主机外)的原型链最终都会指向Object.prototype

____proto____、prototype、constructor的关系

  • 实例对象的 _proto _ 指向他的构造函数的prototype原型对象。
  • prototype原型对象的constructor指向构造函数本身
  • 构造函数的prototype的_ proto_指向他的构造函数的prototype
  • 最终会指向Object.prototype (Object.prototype._ proto _指向null)
    function Person(){}
    let person = new Person()
    console.log( person.__proto__ === Person.prototype) //true
    console.log(Person.prototype.constructor)//Person
    console.log(Person.__proto__ === Function.prototype) //true
    console.log(Object.prototype.__proto__)//null
    console.log(Function.prototype.__proto__ == Object.prototype) 
   //true 最终会指向Object.prototype

原型链

  • 如果在一个对象上找某个属性,如果它本身没有 就去它的proto去找。如果它的构造函数的原型对象没有。那就去它构造函数的原型对象的proto去找,一直找到Object.prototype为止.返回undefined
function Person() {
    this.name = '李明';
    this.say = function () {
      console.log('说话')
    }
  }
  Person.prototype.doSomeThing = function(){
    console.log('做事情')
  }
  Object.prototype.eat = function () {
    console.log('吃东西')
  }
 Function.prototype.sport= function () {
    console.log('做运动')
  }
  let person = new Person()
  person.doSomeThing()//做事情
  person.eat()//吃东西
person.sport()//报错。sport is not a function 
Person.sport()//做运动
//查找过程  person 本身没有 doSomeThing .然后去Person 的原型对象去找。找到了。

 //person本身没有eat  去他的构造函数的原型上找。没找到。然后去
  Person.prototype.__proto__找 。也就是Object的prototype找。找到了。

相关文章

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • 2022前端高频面试题

    JS相关 1.原型和原型链是什么 原型和原型链都是来源于对象而服务于对象的概念js中引用类型都是对象,对象就是属性...

  • 关于JS中的原型和原型链

    目录 关于js 对象和原型 原型链 基于原型链的继承 参考资料ECMAScript 6 入门JavaScript原...

  • 深入javascript之原型和原型链

    原型和原型链是js中的难点也是重点,明白了原型和原型链会让我们在后面不管是学习还是工作都会更加高效,并且原型和原型...

  • JavaScript原型对象与原型链

    一、前言 原型和原型链是 JavaScript中不可避免需要碰到的知识点,在刚开始学习 JS 时,原型和原型链都是...

  • 原型和原型链

    今天发现一张特别好的图(↑↑↑上图↑↑↑),对原型和原型链的理解特别直观友好。 原型和原型链 基础储备:每个 JS...

  • 2018-01-09 关于javascript原型链的思考 pl

    s 深入理解原型和原型链? 构造函数 理解原型和原型链 new的时候js都干了什么? 一个实现继承的demo 构造...

  • js基础(三)

    js基础 原型链和原型对象 ... ... js没有继承原型对象prototype通常用来添加公共的属性或行为且只...

网友评论

      本文标题:js原型和原型链

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