js面向对象

js面向对象-单体对象-工厂模式

单体对象

var tom = {
    name :'tom',
    age:18,
    showname:function(){
        alert(this.name)
    }
    showage:function(){
        alert(this.age)
    }
}

属性 和方法都必须用 ,分开。注意showname 和showage之间都有分号.对象里边完全是一个字典的形式。
手动创建了一个对象,在创建一个对象就再写一遍,累。

试试工厂模式


工厂模式

    var Tom = new Object();
    Tom.name = 'tom';
    Tom.age = 18;
    Tom.showage = function(){
        alert(this.age)
    }
    alert(Tom.showage());

相比于字典模式这中对象的创建是先创建一个空对象。添加属性name和方法等。这个都是相当于绑定到变量。

采用工厂模式快速创建对象

function Person(name,age,job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;

    o.showname = function(){
        alert(this.name);
    }
    o.showage = function(){
        alert(this.age);
    }
    o.showjob = function(){
        alert(this.job);
    }
    return o;
}

创建一个对象

var Tom = Person('tom',18,'全栈');
Tom.showjob();

var Jack = Person('jack',19,'销售');
Jack.showjob();

调用alert(Tom.showjob == Jack.showjob) 返回False
缺点方法都是自己的,就好像功能一样但是,具体不是一个人,浪费了空间,可以使用其他方式共享方法.


构造函数

function Person(name,age,job){

    this.name = name;
    this.age = age;
    this.job = job;

    this.showname = function(){
        alert(this.name);
    }
    this.showage = function(){
        alert(this.age);
    }
    this.showjob = function(){
        alert(this.job);
    }
}

调用相当于利用构造方式初始化了属性。
实例化对象

var Tom = new Person('tom',18,'全栈')
Tom.showage();

var Jack = new Person('jack',28,'美工')
Jack.showage();

如果不用new创建对象,不加new关键字,没法调用Jack.showage等一系列方法。这样的创建方式方法也是独立的
alert(Tom.showage == Jack.showage); 也是False


共享方法

方法或者属性加上prototype关键字,对象就共享了这个数据或者方法。

    function Person(){

    }
    Person.prototype.name = 'tom';
    Person.prototype.age = '18';


    var tom = new Person();
    var jack = new Person();
    alert(tom.name);
    alert(jack.name);

这里的tom.name = jack.name = ‘tom’

所以不同的属性应该放到里边内部属性中.

    function Person(){

    }
    Person.prototype.name = 'tom';
    Person.prototype.age = '18';


    var tom = new Person();
    var jack = new Person();
    alert(tom.name);

以上代码可以改写为

    function Person(name,age){
        this.name = name;
        this.age = age;
    }

    Person.prototype.showname = function(){
        alert(this.name);
    }

    Person.prototype.showage = function(){
        alert(this.age);
    }

    var tom = new Person('tom',20);
    var jack = new Person('jack',18);

    alert(tom.name);
    alert(tom.showage == jack.showage);

最后的值是返回true,也就共享了方法。

本文总阅读量