学习咯2-面向对象编程/原型及原型链

80 阅读2分钟

一、面向对象

对象是容器(封装了属性&方法),是对于单个物体的简单描述。

简单对象、函数对象

二、构造函数

通过new函数名来实例化对象的函数叫构造函数

单例函数:1.只有一个实例。2.可以全局访问

每个对象在创建的时候,会自动拥有一个构造函数属性constructor

object.constructor === Object

三、原型

定义:给其他对象提供共享属性的对象。(每个函数都会创建一个prototype属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。)

object.proto === Object.prototype

原型链

三部分组成:1、原型对象;2、构造函数;3、实例对象

function Person () {}
const person1 = new Person()
person1.__proto__ === Person.prototype
Person.prototype.__proto__ === Object.prototype
person1.__proto__.__proto__ === Object.prototype
Object.prototype.__proto__ === null
person1.__proto__.__proto__.__proto__ === null
...

[doris]的www.zhihu.com/question/34… 这篇回答的图,很有用哦。

q1:如何在外界无感知(全局只要有一个实例)的情况下,拿到构造函数实例化后的对象?

a:

function AFn () {
    if (!(this instanceof AFn)) {
        // instanceof 用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上,语法:object instanceof Constructor
        // 如果该构造函数没有被实例化,this指向函数体本身fn,如果已经被实例化,则指向实例本身object
        return new AFn()
    }
    this.aa = 1
    this.aaa = 1
    this.aaaa =  () => {
        console.log('aa----', this.aa)
    }
}
const a = AFn()

q2:new?

a:

function myNew (Fn, ...args) {
    const newObj = {}
    newObj.__proto__ = Fn.prototype
    const res = Fn.apply(newObj, args) // 这里执行了Fn,且转变了this,如果原Fn执行就有return一个Obj的,则直接返回,否则返回一个实例化后的新对象
    return res instanceof Object ? res : newObj
}

1、创建了一个对象

2、将对象的原型指向构造函数的prototype属性

3、将当前的对象赋给了内部this

4、执行了构造函数初始化代码

q3:js实现继承?

a: 将父的实例绑定到子的prototype上,同时子原型的构造函数constructor指回自己保持自己独立,是子继承父。(本质就是重写了原型对象,将父对象的属性、方法,作为子对象原型对象的属性方法,同时重写构造函数。)

q4:扩展:继承、经典继承(构造函数继承)、组合继承、寄生组合继承、多重继承。