JS⾯向对象的⼏种写法
JS 中,⾯向对象有⼏种写法。归纳下,⼤概有下⾯这⼏种:⼯⼚模式,构造函数模式,原型模式,构造函数与原型模式的混合使⽤,原型链继承,借⽤构造函数继承。
⼀、⼯⼚模式
function person (name,age,job){
var o={};//定义o这个对象
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
console.log(this.name);
}
return o;
}
var demo=person('tj',22,'fe');
console.log(demo);
闭包使⽤的原理与之很相似,最后返回的
⼆、构造函数模式
构造函数本⾝也是函数,只不过是⼀个创建对象的函数
function Person(name,age){  //构造函数以⼤写字母开头,普通函数以⼩写字母开头
this.name=name;
this.age=age;
this.sayName=function(){
console.log(this.name)
};
}
var demo2=new Person('tj2',23)
console.log(demo2)
}
使⽤构造函数有⼀些注意点:必须使⽤new操作符,调⽤构造函数会经历以下四步:
1、创建⼀个新的对象
2、将构造函数的作⽤域给了新对象(this指向新对象),其中this 是全局变量,window.age  获取的结果是⼀样的。
3、对新对象添加属性
4、返回新对象
三、原型模式
每个函数都有⼀个prototype属性,这个属性是⼀直指针,指向⼀个对象,这个对象的⽤途是包含可以由特定类型的实例共享的属性和⽅法。
js原型和原型链的理解使⽤原型对象的好处是可以让所有对象实例共享他所包含的属性和⽅法。不必在构造函数中定义对象实例的信息,⽽是可以将这些信息直接添加到原型对象中。
function Person(){  }
Person.prototype.name ='tj3';
Person.prototype.age=24;
Person.prototype.sayName= function(){
alert(this.name)
}
var demo3= new Person();
console.log(demo3);
//更简单的原型办法
function Person(){
}
Person.prototype={
name:'tj4',
age:25,
sayName:function(){
alert(this.name)
}
};
var demo4=new Person();
console.log(demo4);
四、组合使⽤构造函数和原型模式
构造函数模式⽤于定义实例属性,⽽原型模式定义⽅法和共享的属性。这种混合模式还⽀持向构造函数传递参数。 1function Person(name,age,job){
2this.name=name;
3this.age=age;
4this.job=job;
5this.sayName=function(){
6            alert(this.name)
7        }
8      }
9
10    Person.prototype ={
11          sayJob:function(){
12            console.log(this.job);
13        }
14      }
15
16
17var person1=new Person('tj',22,'fe');
五、原型链继承
原型链继承的主要思想是利⽤原型让⼀个引⽤类型继承另⼀个引⽤类型的属性和⽅法。
注意点:通过原型链继承是不能使⽤对象字⾯量创建原型⽅法,这样会重写原型链!
function SuperType(){
}
function SubType(){
}
SubType.prototype=new SuperType();//继承了SuperType
var instance1=new SubType();
console.log(instance1);
六、借⽤构造函数继承
其实就是⽤call和apply实现继承
1function wanda(){
<=[1,2,3]
3    }
4
5function sicong(){
6        wanda.call(this);
7    }
8
9var sc = new sicong();
10    sc.money.push(666)
11    console.log(sc)
七、组合继承
将原型链和借⽤构造函数的技术组合起来⼀起⽤,好处是既能实现函数的复⽤,⼜能保证每个实例有⾃⼰的属性。function SuperType(name) {
this.name = name;
}
SuperType.prototype.sayName = function() {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name);//继承属性
this.age = age;
}
SubType.prototype = new SuperType();//继承⽅法
var instance1 = new SubType('tj', 22);
instance1.sayName();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。