一、对象创建模式
1.Object构造函数
缺点:
/* 1. 组织形式不好 2. 没有类型 3. 内存开销大 4. 代码冗余 */ var obj = new Object(); obj.age=18; obj.name="zyy"; obj.say=function () { console.log("城市套路深 我要回农村 农村路更滑 人心更复杂") } var obj2 = new Object(); obj2.age=19; obj2.name="zyy"; obj2.say=function () { console.log("-----") }
2.字面量
缺点:
/*
2. 没有类型
3. 内存开销大
4. 代码冗余
*/
改善:
// 1. 组织形式比较友好
var obj ={ name:"zyy", age:18, say:function () { console.log("----") } } var obj2 ={ name:"zyy2", age:38, say:function () { console.log("*****") } }
3.工厂模式
缺点:
/* 2. 没有类型 3. 内存开销大 */ 改善: // 1. 组织形式比较友好 // 4. 代码不冗余 function createObj(name,age,msg) { return { name:name, age:age, say:function (msg) { console.log(msg) } } } var obj = createObj("damu",18,"胡话"); var obj2 = createObj("zyy",48,"鬼话"); console.log(obj,obj2)
4.自定义构造函数
缺点:
/* 3. 内存开销大 */ 改善: // 1. 组织形式比较友好 // 4. 代码不冗余 // 2. 拥有类型 function Person(name,age) { // var food; this.name =name; this.age =age; this.eat=function (food) { // var food; console.log(food) } } var damu = new Person("达姆",18); damu.eat("核桃"); var fyz = new Person("张艳英",48); fyz.eat("大嘴巴子"); // console.log(damu instanceof Person,fyz);
5.自定义构造函数+原型链
改善:
// 1. 组织形式比较友好 // 4. 代码不冗余 // 2. 拥有类型 // 3. 内存开销相对减少 Person.prototype.eat=function (food) { console.log(this.name+"吃"+food) } function Person(name,age,food) { this.name =name; this.age =age; } var damu = new Person("达姆",18); damu.eat("核桃"); var fyz = new Person("张艳英",48); fyz.eat("大嘴巴子");
6.create函数
<script> var obj ={};// __proto__ console.log(obj) // var 对象 = Object.create(obj) // 会创建出一个对象 只是这个对象的隐式原型会被显式的指定 指定为obj var obj2 = Object.create({a:"a"}) console.log(obj2) </script>
二、继承模式
1.原型链继承
(1)继承套路
1.定义父类型构造函数
2.给父类型的原型添加方法
3.定义子类型的构造函数
4.创建父类型的对象赋值给子类型的原型
5.将子类型原型的构造属性设置为子类型
6.给子类型原型添加方法
7.创建子类型的对象:可以调用父类型的方法
(2)代码演示
// 属性还是使用构造函数继承的方式 // 函数使用原型链继承 // 污染了父类 Person.prototype.eat = function () { console.log("eat") }; function Person(name,age) { this.name = name; this.age = age; } Teacher.prototype = Person.prototype; Teacher.prototype.teach=function () { console.log("teach") } function Teacher(classNo,name,age) { Person.call(this,name,age); this.classNo =classNo; } var damu = new Teacher("18_1128","达姆",18) console.log(damu.teach,damu.eat);
2.构造函数继承
function Person(name,age) { this.name = name; this.age = age; this.eat = function () { console.log("eat") }; } function Teacher(classNo,name,age) { Person.call(this,name,age); this.classNo =classNo; this.teach=function () { console.log("teach") } } function Student(id,name,age) { Person.call(this,name,age); this.id =id; this.study=function () { console.log("study") } } var damu = new Teacher("18_1128","达姆",18) console.log(damu); var lxf = new Student("38","张艳英",18) console.log(zyy);
3.组合继承(原型链+构造函数)
// 属性还是使用构造函数继承的方式 // 函数使用原型链继承 // 污染了父类 Person.prototype.eat = function () { console.log("eat") }; function Person(name,age) { this.name = name; this.age = age; } Teacher.prototype = new Person(); Teacher.prototype.constructor = Teacher; Teacher.prototype.teach=function () { console.log("teach") } function Teacher(classNo,name,age) { Person.call(this,name,age); this.classNo =classNo; } var p = new Person("张艳英",28) console.log(p.teach,p.eat); var damu = new Teacher("18_1128","达姆",18) console.log(damu.teach,damu.eat);