创建类的方法一:工厂方法方式
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();
特点:方法只拥有一份