js 面向对象(一)创建对象与继承

面向对象是一项非常有用的模式,js在初生时并没有考虑太多这方面的问题,后来无数js大牛创造出了这种模式,感觉js创建对象的方法也有很多,工厂模式,原型模式,构造函数模式等等。。。。各大教科书高程什么的讲得很全,个人筛选出了可能比较好的两种模式,毕竟没法记住所有的方法。。

创建对象

法一:组合使用构造函数模式和原型模式

function Person( name, sex, height){
this. name = name;
this. sex = sex;
this. height = height;
this. friend = [ "liao", "liaoliao"];
}
Person. prototype = {
construtor :Person,
say : function(){
console. log( "i'm "+ this. name);
}
}

个人的想法是,构造函数中定义好这个对象所含有的变量,而原型方面定义好这个对象的函数,从而实现了“属性”和“功能”的分离,创建多个对象时也不会影响这里的friends数组,不是引用而是创建

法二:稳妥构造函数(不是寄生式构造,寄生式构造不能用instanceof确定对象类型,不建议使用寄生式构造)

function Person( name, sex, height){
var o= new Object();
var name = name;
var sex = sex;
var height = height;
var friend = [ "liao", "liaoliao"];
o. say = function(){
console. log( "i'm "+ name);
}
return o;
}
var person1 = new Person( "liao", "boy", 150);
person1. say();
console. log( person1. friend);
person1. name= "gg";
person1. say();

这种构造方式最大的特点就是安全,封装性很好,不可以改变定义好对象的内部变量,但要注意三点(在某博客上看到的)

注意: (以下3点)
1. 在稳妥构造函数中变量不能挂到要返回的对象o中
2. 在稳妥构造函数中的自定义函数操作元素时使用不要用this

3. 在函数外部使用稳妥构造函数时不用new。


较为完整的测试代码(带了个继承)

function Person( name, sex, height){
this. name = name;
this. sex = sex;
this. height = height;
this. friend = [ "liao", "liaoliao"];
}
Person. prototype = {
construtor :Person,
say : function(){
console. log( "i'm "+ this. name);
}
}
//寄生式构造
// function Person(name,sex,height){
// var o = new Object();
// o.name = name;
// o.sex = sex;
// o.height = height;
// o.friend = ["liao","liaoliao"];
// o.say = function(){
// console.log("i'm "+this.name);
// }
// return o;
// }
//稳妥构造
// function Person(name,sex,height){
// var o=new Object();
// var name = name;
// var sex = sex;
// var height = height;
// var friend = ["liao","liaoliao"];
// o.say = function(){
// console.log("i'm "+name);
// }
// return o;
// }
// var person1 = Person("liao","boy",150);
// person1.say();
// console.log(person1.friend);
// person1.name="gg";
// person1.say();
function Superman(){
var superman = new Person();
superman. name = "wyp";
superman. fly = function(){
superman. say. call( this);
console. log( this. name+ " is flying");
};
return superman;
}
var person1= new Person( "yao", "公", 150);
var person2= new Person( "ji", "母", 160);
person1. say();
console. log( person1. friend);
person1. friend. push( "bulaili");
console. log( person1. friend);
console. log( person2. friend);
person2. say();
person1. name= "2333";
person1. say();
var wyp= new Superman();
wyp. fly();
wyp. name = "daer";
wyp. fly();


上述用的是寄生式继承,个人觉得传统的原型链+组合函数-》组合继承,比较散化封装性不太好,写多了容易逻辑混乱

然后看了看寄生式继承与寄生式组合继承,两者非常像:思路都是创建对象->增强对象->返回对象,于是没有就着高程上所写的把构造函数借用和原型链操作分开,而是做了个封装觉得这样的风格最好吧~,虽然只是个寄生式继承orz

你可能感兴趣的:(js)