JavaScript类的创建方式

创建类的方法一:工厂方法方式

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();

 特点:方法只拥有一份

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值