创建类的方法一:工厂方法方式
function createObject(username ,password) {
var obj = new Object();
obj.username = username;
obj.password = password;
obj.get = function(){ //将匿名函数赋值给get
alert("username: " + this.username + "\npassword:" + this.password);}
return obj;//通过return 返回回去所创建的对象
}
var o = createObject("lgk","111");
o.get();
创建类的方法二:构造方法方式
function Person(username,password) {
this.username = username;
this.password = password;
this.get = function() {
alert("username: " + this.username + "\npassword:" + this.password);
}
}
var person = new Person("lgk","123");
person.get();
这两种方法都有一个共同点,那就是每生成一个对象都会生成一个方法的,在java中方法只生成一份的,怎么解决呢??
将方式提取放到外面去
function get(){
alert("username: " + this.username + "\npassword:" + this.password);
}
function createObject(username ,password) {
var obj = new Object();
obj.username = username;
obj.password = password;
obj.get = get;
return obj;
}
var o = createObject("lgk","111");
o.get();
function get(){
alert("username: " + this.username + "\npassword:" + this.password);
}
function Person(username,password) {
this.username = username;
this.password = password;
this.get = get;
}
var person = new Person("lgk","123");
person.get();
这样就只生成一次方法了,但是随即又产生了一个新的问题,在面向对象的语言中,一般属性和方法都是不分开的,都是写在类中的,而上面的例子中把方法写到了类的外面去了,看上去似乎不符合面向对象的思想。我们可以采用后面的方法去解决这个问题。
类的创建方式三:原型方式
特点:属性和方法只产生一次
function Person(){
}
Person.prototype.username = "lgk";
Person.prototype.password = "123";
Person.prototype.get = function() {
alert("username:" + this.username + "\npassword:" + this.password);
}
var p1 = new Person();
p1.username = "dd";
p1.get();
var p2 = new Person();
p2.get();
原型方式存在的弊端:
1、构造方式只能是空的,不能传递参数,要想改变参数只能通过先new出对象,然后通过js的晚绑定机制来实现
2、最致命的缺点是:当对象的属性值是引用类型的时候,第一个对象的属性发生变化后会反应到第二个对象的属性上去,因为他们使用的是同一份属性空间。
如:
function Person(){
}
Person.prototype.username = new Array();
Person.prototype.password = "123";
Person.prototype.get = function() {
alert("username:" + this.username + "\npassword:" + this.password);
}
var p1 = new Person();
p1.username.push("dddd");
p1.get();
var p2 = new Person();
p2.get();
这时候p2的username属性也成了dddd了。
创建类的方法四:混合的构造方法与原型方式(强烈推荐)
function Person(username, password){
this.username = username;
this.password = password;
}
Person.prototype.get = function() {
alert("username:" + this.username + "\npassword:" + this.password);
}
var p1 = new Person("lgk","1111");
p1.get();
var p2 = new Person("shzh","2222");
p2.get();
特点:
属性采用构造方法方式定义,方法采用原型方式定义。每产生一个对象,它们拥有各自的属性,但是都共同拥有 一 份 方法。符合面向对象的思想。当对象中的属性是引用类型的时候,它们之间的属性也不会相互干扰。
缺点:类是属性和方法还是分开了
类的创建方式五:动态原型
function Person() {
this.username = "lgk";
this.password = "123";
if(typeof Person.flag == "undefined") {
alert("executed");
Person.prototype.get = function() {
alert("username: " + this.username + "\npassword: " + this.password);
}
Person.flag = true;
}
}
var person = new Person();
var person2 = new Person();
person.get();
person2.get();
特点:方法只拥有一份
本文详细介绍了JavaScript中创建类的五种方法,包括工厂方法、构造方法、原型方式、混合构造与原型方式及动态原型方式,并对比了各种方法的特点与适用场景。

被折叠的 条评论
为什么被折叠?



