JS高级程序设计-对象

110 阅读1分钟

参考jsliang,手打一遍加深记忆~

1.创建对象

工厂模式

function factory(name){

var o=new Object();

o.name=name;

return o

}

构造函数

function Person(name, age) {

this.name = name;

this.age = age;

this.eat = function () {

console.log(`${name}年龄是${age}`)

}

}

原型模式

function Person(name, age) {

}
Person.prototype.name="zhao"

2.对象继承

构造函数继承

知识点: proto prototype new apply call

1.搞个构造函数继承

2.在构造函数的原型上定义一个方法,这样子就可以函数的实例化对象就可以有原型上的方法啦。

Person.prototype.eatPro = function () {

console.log(`${this.name}年龄是${this.age}`)

}

3.测试是否结果正确

var aa = new Person("xiaowang", 15)

var bb = new Person("甜甜", 15)

aa.eatPro()

bb.eatPro()

console.log(aa.eatPro() === bb.eatPro())

为什么要在原型上定义方法而不是在构造函数中定义方法呢?因为实例化对象中调用每个方法会产生内存,占用空间。原型上直接定义就可以解决这个问题。

借用构造函数继承

function SuperType(){

this.colors=['red','green']

}

function subType(){

SuperType.call(this)

}

var c=new subType()

c.colors.push('black')

console.log(55,c) //55,{"colors":["red","green","black"]}

new做了什么?

new主要做的就是返回一个对象,对象的_proto_属性指向构造函数实例的原型。

new的操作: 1.创建一个空对象 2.空对象的proto属性指向构造函数的原型 3.this指向空对象

function myNew(Con,...args){

//创建一个新的空对象

let obj={}

//空对象的_proto_属性指向构造函数的原型

Object.setPrototypeOf(obj,Con.prototype)

//this指向空对象

let res=Con.apply(obj,args)

return res instanceof Object?res:obj

\


}