javascript9.0(定义对象)

[color=red][size=medium]JavaScript中定义对象的几种方式(JavaScript中没有类的概念,只有对象):
1) 基于已有对象扩充其属性和方法(就是给属性和方法赋值):[/size][/color]
<html>
<head>
<script type="text/javascript">
var object = new Object();
object.name = "zhangsan";
object.sayName = function(name) {
this.name = name;
alert(name);
}

object.sayName("lisi");
</script>
</head>
<body>
</body>
</html>


[color=red][size=medium]2)工厂方式[/size][/color]
<html>
<head>
<script type="text/javascript">
function createObject() {
var object = new Object();
object.username = "zhangsan";
object.password = "111";

object.get = function() {
alert(this.username + "," + this.password);
}

return object;
}

var object1 = createObject();
var object2 = createObject();

object1.get();
</script>
</head>
<body>
</body>
</html>

[color=red]带参数的构造方法:[/color]
<html>
<head>
<script type="text/javascript">
function createObject(username, password) {
var object = new Object();
object.username = username;
object.password = password;

object.get = function() {
alert(this.username + "," + this.password);
}

return object;
}

var object1 = createObject("zhangsan", "111");
var object2 = createObject("lisi", "222");

object1.get();
object2.get();
</script>
</head>
<body>
</body>
</html>

[color=red]让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。[/color]
<html>
<head>
<script type="text/javascript">
function get() {
alert(this.username + "," + this.password);
}
function createObject(username, password) {
var object = new Object();
object.username = username;
object.password = password;

object.get = get;

return object;
}

var object1 = createObject("zhangsan", "12");
var object2 = createObject("lisi", "23");

object1.get();
object2.get();
</script>
</head>
<body>
</body>
</html>


[color=red][size=medium]在方法里面创建一个对象,然后返回这个对象,这就是使用的工厂方法。[/size][/color]


[color=red][size=medium]3) 构造函数方式[/size][/color]
<html>
<head>
<script type="text/javascript">
function Person() {
//在执行第一行代码前,js引擎会为我们生成一个对象
this.username = "zhangsan";
this.password = "123";

this.getInfo = function() {
alert(this.username + "," + this.password);
}

//此处有一个隐藏的return语句
}

var person = new Person();
person.getInfo();
</script>
</head>
<body>
</body>
</html>


[color=red]可以在构造对象时传递参数[/color]

<html>
<head>
<script type="text/javascript">
function Person(username, password) {
//在执行第一行代码前,js引擎会为我们生成一个对象
this.username = username;
this.password = password;

this.getInfo = function() {
alert(this.username + "," + this.password);
}

//此处有一个隐藏的return语句
}

var person = new Person("zhangsan", "2222");
person.getInfo();
</script>
</head>
<body>
</body>
</html>


[color=red][size=medium]4)原型(“prototype”)方式[/size][/color]

<html>
<head>
<script type="text/javascript">
function Person() {
}

Person.prototype.username = "zhangsan";
Person.prototype.password = "123";

Person.prototype.getInfo = function() {
alert(this.username + "," + this.password);
}

var person = new Person();
var person2 = new Person();

person.username = "lisi";
person.getInfo();
person2.getInfo();
</script>
</head>
<body>
</body>
</html>


[color=red]个人理解,原型模式就是变量开始的时候是共享的,由于username是String类型的,所以当username改变值的时候,它们的getInfo打印的结果是不同的,如果username是一个数组,那么情况就不同了,数组里面虽然放入东西了,但是它们还是指向同一个数组。[/color]

[color=red]下面代码打印结果就可以看出。password是不同的,但是username数组结果是一样的。[/color]
<html>
<head>
<script type="text/javascript">
function Person() {
}

Person.prototype.username = new Array();
Person.prototype.password = "123";

Person.prototype.getInfo = function() {
alert(this.username + "," + this.password);
}

var person = new Person();
var person2 = new Person();

person.username.push("zhangsan");
person.username.push("lisi");
person.password = "456";
person.getInfo();
person2.getInfo();
</script>
</head>
<body>
</body>
</html>

[color=red]如果使用原型方式对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反应到其他对象当中。[/color]

[color=red]单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。
使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法[/color]

<html>
<head>
<script type="text/javascript">
function Person() {
this.username = new Array();
this.password = "123";
}

Person.prototype.getInfo = function() {
alert(this.username + "," + this.password);
}

var person = new Person();
var person2 = new Person();

person.username.push("zhangsan");
person.username.push("lisi");
person.password = "456";
person.getInfo();
person2.getInfo();
</script>
</head>
<body>
</body>
</html>


[color=red][size=medium]5) 动态原型方式:在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。[/size][/color]

<html>
<head>
<script type="text/javascript">
function Person() {
this.username = "zhangsan";
this.password = "123";

if(typeof Person.flag == "undefined") {
alert("invoked");

Person.prototype.getInfo = function() {
alert(this.username + "," + this.password);
}

Person.flag = true;
}
}


var person = new Person();
var person2 = new Person();

person.getInfo();
person2.getInfo();
</script>
</head>
<body>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值