一、面向对象
对象是容器(封装了属性&方法),是对于单个物体的简单描述。
简单对象、函数对象
二、构造函数
通过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
}