JS划重点——类和对象的不正经阐述


JS划重点——类和对象的不正经阐述

/在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/
/首先是普罗大众都会的 工厂模式来创建一类/

function creates(name,sex,age,b) {
    var  w = new  Object;
    w.name = name;
    w.sex = sex;
    w.age = age;
    w.single = b;
    w.show = function(){
        for (prop in w) {
            console.log("w." + prop + " = " + w[prop]);
        }
    }
    return w ;
}

var w1 = creates('啊港','男',21,true)
var w2 = creates('啊财','男',20,false)
w1.show()
w2.show()

/这种方式创建的对象很不好,每次执行都会有一个show函数被创建,可以这样写来解决对各show函数的问题/

function showinfor(){
        for (prop in this) {
            console.log(this+"." + prop + " = " + this[prop]);
        }
    }


function creates(name,sex,age,b) {
    var  w = new  Object;
    w.name = name;
    w.sex = sex;
    w.age = age;
    w.single = b;
    w.show = showinfor
    return w ;
}
var w1 = creates('啊港','男',21,true)
var w2 = creates('啊财','男',20,false)
w2.show()
w1.show()

/但看起来就特别别扭,这个show函数一点也不像是对象里面所包含的方法,这就出现了JS的构造函数来解决/

function creatW(name,sex,age,b) {
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.single = b;
    this.show = function(){
        alert(this.name+"使用了构造函数来创建对象")
    };
    
}
var w1 = new creatW('啊港','男',21,true)
w1.show()

/现在可以用new 运算符来创建对象了,里面用的是this,不需要return对象,but 但是这种方式每个对象的shou函数也是不同的和工厂模式同父异母/

/来,邀请原型方式出场/

function w () {
    
}
w.prototype.name='啊港'
w.prototype.sex='男'
w.prototype.show=function(){
    alert(this.name+'使用了原型创建对象')
}

var w1 = new w()
w1.show()

/这种方式每个函数创建的对象都会公用里面的属性和方法,但是使用这种方式不能给函数传参来初始化参数,所以构造加原型模式出场/

function w (name,sex,age,b) {
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.single = b;
}

w.prototype.show=function(){
    alert(this.name+'使用了构造加原型创建对象')
}

var w1 = new w('啊港','男',21,true)
w1.show()

/这种方式是目前最流行欢迎的创建对象的方式之一,还有一种动态原型创建模式/

function w (name,sex,age,b) {
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.single = b;
    if(typeof w._initialized == 'undefined'){
        w.prototype.show=function(){
            alert(this.name+'使用了动态原型创建对象')
        }
        w._initialized=true
    }
}

var w1 = new w('啊港','男',21,true)
w1.show()
var w2 = new w('啊财','男',21,true)
w2.show()

/initialized判断是否给已经给原型赋予了任何方法如果没有就创建,然后赋值为true,之后就不会创建show方法/

猜你喜欢

转载自www.cnblogs.com/WG-console/p/10091275.html