JavaScript学习12 JS中定义对象的几种方式【转】
<script language="javascript" type="text/javascript"> //(1)把一个方法变成一个对象,为对象创建方法和属性 var Name = function () { //通过prototype给一个对象创建方法 Name.prototype.Add = function (num, title) { } //也可以直接用this加方法名为对象创建方法和上面的等价 this.Way = function (str) { } //为对象添加属性值 Name.prototype.xing = "123"; //定义静态属性和方法 Name.shi = "static"; Name.Addd = function (num, title) { } //静态定义的局部属性和方法只能在静态的类型里面用 alert(Name.shi); Name.Addd(1, 2); } //方法也可以这样声明 function Name1() { Name1.prototype.add = function () { } this.way = function () { } Name1.prototype.shu = "other"; } //静态定义的全局属性和方法通用 Name.sha = "static"; Name.Addd2 = function () { } alert(Name.sha); //调用静态属性 Name.Addd2(); //调用静态方法 var name = new Name(); name.Add(); //对象调用方法 name.Way(); alert(name.xing); //对象调用属性 /*静态的全局变量,在方法外可以调用;静态的局部变量和方法仅限于方法内使用;实例对象不能调用静态的方法 */ /*实例对象不能使用prototype; */ //(2)Javascript面向对象 继承 //父类 function Class() { this.name = "name"; this.method = function () { alert("method"); } } //子类 function Class1() { this.name1 = "name1"; this.method1 = function () { alert("method1"); } } //子类继承父类 Class1.prototype = new Class(); var obj = new Class1(); alert(obj.name); alert(obj.name1); obj.method(); obj.method1(); /****** 子类继承父类的语法,子类.prototype=new 父类(); *****/ //(3)子类重写父类 //子类 function Class2() { this.name2 = "name2"; this.method2 = function () { alert("method2"); } } Class2.prototype = new Class(); //继承 Class2.prototype.name = "updateName"; //重写父类的属性 Class2.prototype.method = function () {//重写父类的方法 alert("UpdateMethod"); } var obj2 = new Class2(); alert(obj2.name); //显示updateName obj2.method(); //显示UpdateMethod alert(obj2.name2); obj2.method2(); //(4){}里面的为对象 var arr = new Array(); arr.push({ "name": "1", "age": 12, funA: function () { } }); arr.push({ "name": "2", "age": 13 }); arr.push({ "name": "3", "age": 14 }); for (var i = 0; i < arr.length; i++) { alert(arr[i].name); alert(arr[i].age); alert(arr[i].funA()); } /****一个对象也可以这么定义***/ var newObject = { "name": "Jim", "sex": "Man", Way: function () { } }; </script>
avaScript学习12 JS中定义对象的几种方式
转自: http://www.cnblogs.com/mengdd/p/3697255.html
JavaScript中没有类的概念,只有对象。
在JavaScript中定义对象可以采用以下几种方式:
1.基于已有对象扩充其属性和方法
2.工厂方式
3.构造函数方式
4.原型(“prototype”)方式
5.动态原型方式
一.基于已有对象扩充其属性和方法
<script type="text/javascript">
var object = new Object();
object.name = "zhangsan";
object.sayName = function(name)
{
this.name = name;
alert(this.name);
}
object.sayName("lisi");
</script>
这种方式的弊端:这种对象的可复用性不强,如果需要使用多个对象,还需要重新扩展其属性和方法。
二.工厂方式
function createObject()
{
var object = new Object();
object.username = "zhangsan";
object.password = "123";
object.get = function()
{
alert(this.username + ", " + this.password);
}
return object;
}
var object1 = createObject();
var object2 = createObject();
object1.get();
改进一:采用带参数的构造方法:
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", "123");
object1.get();
改进二:让多个对象共享函数对象
这样,不用每个对象都生成一个函数对象。
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 object = createObject("zhangsan", "123");
var object2 = createObject("lisi", "456");
object.get();
object2.get();
优点:让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。
缺点:对象和它的方法定义分开了,可能会造成误解和误用。
三.构造函数方式
改进版:加上参数:
function Person(username, password)
{
this.username = username;
this.password = password;
this.getInfo = function()
{
alert(this.username + ", " + this.password);
}
}
var person = new Person("zhangsan", "123");
person.getInfo();
四.原型(“prototype”)方式
例子:
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();
使用原型存在的缺点:
1.不能传参数;
2.有可能会导致程序错误。
如果使用原型方式来定义对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反映到其他对象当中。
单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。
比如,username改为数组后:
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(); //输出:zhangsan,lisi, 456
person2.getInfo(); //输出:zhangsan,lisi, 123
//虽然没有对person2对象进行修改,但是它的name和person是一样的,即为zhangsan,lisi
这是因为使用原型方式,person和person2指向的是同一个原型,即对应了同样的属性对象。
对于引用类型(比如数组),两个对象指向了同一个引用,所以对一个所做的更改会影响另一个。
而对于字符串(字面常量值),重新赋值之后就指向了另一个引用,所以二者的修改互不影响。
对原型方式的改进:
使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法。
<script type="text/javascript">
//使用原型+构造函数方式来定义对象
function Person()
{
this.username = new Array();
this.password = "123";
}
Person.prototype.getInfo = function()
{
alert(this.username + ", " + this.password);
}
var p = new Person();
var p2 = new Person();
p.username.push("zhangsan");
p2.username.push("lisi");
p.getInfo();
p2.getInfo();
</script>
五.动态原型方式
在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。
<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 p = new Person();
var p2 = new Person();
p.getInfo();
p2.getInfo();
</script>


浙公网安备 33010602011771号