好久没写博客了,今天补一下,废话不多说,咱们进入正题。
在java中,有这么一句话叫”万物接对象“,那么我今天就来说一下在JavaScript中怎么创建对象,当然要与其他语言作对比,作参照,才能更容易理解。
对象由什么组成,方法与属性(行为)。
在java中怎么创建对象,无非就是Object obj = new Object(),没错,JavaScript中也可以使用如此,细心的同学会发现,大多数语言在大多数方面有共通之处,
方法一、
工厂模式:
对于工厂模式,这个词大家都不陌生,陌生的话脑补一下”工厂“的车间的生产方式,没错,就是那样,举个栗子:
function dog(name, age, voice){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.voice = voice;
obj.bark = function(){
alert(this.voice);
}
return obj;
}
var dog_1 = dog("kugou", 12, " o o o ");
dog_1.bark();
alert(dog_1.name);
这个dog函数可以被调用n次(n->∞),每次调用这个函数都会返回一个含有三个属性和一个方法的对象,但是无法用typeof和instance来判断出对象的类型,即对象无法识别,只能判断出dog_1是object,为此,另外一个模式出现了。
方法二、
构造函数模式,在Java,C++中都有构造函数,而且还差不多,都是函数名跟类名相同,比如:
Java中:
public class dog{
public dog(){
}
}
C++也跟Java一样,在Java和C++中构造函数可以有多个,根据参数的不同而不同,扯远了,拐回来。
在JavaScript中的原生对象都有原生的构造函数,如Object,Array等...。在运行时自动出现在执行环境中。我们也可以创建自定义的构造函数
function dog(name, age, voice){
this.name = name;
this.age = age;
this.voice = voice;
this.bark = function(){
alert(this.voice);
}
}
var dog_1 = new dog("kugou", 12, " o o o ");
dog_1.bark();
在与上面的工厂模式相比,少了显示地创建Object对象,直接将属性和方法都赋给了this对象,而且没有return语句。在创建新的dog对象的时候,要用到new关键字,没错就是new,这跟JavaScript中自带的类的创建方式差不多了吧,new一个对象要经过一下步骤:
①创建一个新对象
②将构造函数的作用域给新对象,<!--this就指向了这个新对象-->
③构造函数中的代码,同时给这个对象添加属性
④返回新对象
对象的constructor属性是用来标识对象的如
alert(dog_1.constructor == dog)
alert(dog_1 instanceof dog);
方法三、
原型模式
我们创建的每一个函数都有一个prototype属性,prototype是个对象,它的用途是包含可以由特定类型的所有实例共享所有的属性和方法。
function dog(){
}
dog.prototype.name = "kugou";
dog.prototype.age = 12;
dog.prototype.voice = " o o o ";
dog.prototype.bark = function(){
alert(this.voice);
}
var dog_1 = new dog();
dog_1.bark();
所有prototype都会自动获得一个constructor属性,如:dog.prototype.constructor就是指向dog的,而我们的dog的构造函数是一个空函数,与构造函数不同的是新对象的这些属性和方法是由所有实例共享的,而构造函数就是独自拥有的。想理解原型模式,就得先理解ECMAScript中得原型的性质。
先讲到这,脑休一下 0.0