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 = ""; //定义静态属性和方法
Name.shi = "static";
Name.Addd = function (num, title) {
}
//静态定义的局部属性和方法只能在静态的类型里面用
alert(Name.shi);
Name.Addd(, ); }
//方法也可以这样声明
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": "", "age": , funA: function () { } });
arr.push({ "name": "", "age": });
arr.push({ "name": "", "age": });
for (var i = ; 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>

JS面向对象

avaScript学习12 JS中定义对象的几种方式

转自:  http://www.cnblogs.com/mengdd/p/3697255.html

  JavaScript中没有类的概念,只有对象。

  在JavaScript中定义对象可以采用以下几种方式:

  1.基于已有对象扩充其属性和方法

  2.工厂方式

  3.构造函数方式

  4.原型(“prototype”)方式

  5.动态原型方式

一.基于已有对象扩充其属性和方法

JavaScript学习12 JS中定义对象的几种方式【转】
 
<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>
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

  这种方式的弊端:这种对象的可复用性不强,如果需要使用多个对象,还需要重新扩展其属性和方法。

二.工厂方式

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
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();
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

改进一:采用带参数的构造方法:

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
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();
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

改进二:让多个对象共享函数对象

  这样,不用每个对象都生成一个函数对象。

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
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();
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

  优点:让一个函数对象被多个对象所共享,而不是每一个对象拥有一个函数对象。

  缺点:对象和它的方法定义分开了,可能会造成误解和误用。

三.构造函数方式

  改进版:加上参数:

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
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();
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

四.原型(“prototype”)方式

  例子:

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
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();
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

  使用原型存在的缺点:

  1.不能传参数;

  2.有可能会导致程序错误。

  如果使用原型方式来定义对象,那么生成的所有对象会共享原型中的属性,这样一个对象改变了该属性也会反映到其他对象当中。

  单纯使用原型方式定义对象无法在构造函数中为属性赋初值,只能在对象生成后再去改变属性值。

  比如,username改为数组后:

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
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
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

  这是因为使用原型方式,person和person2指向的是同一个原型,即对应了同样的属性对象。

  对于引用类型(比如数组),两个对象指向了同一个引用,所以对一个所做的更改会影响另一个。

  而对于字符串(字面常量值),重新赋值之后就指向了另一个引用,所以二者的修改互不影响。

对原型方式的改进:

  使用原型+构造函数方式来定义对象,对象之间的属性互不干扰,各个对象间共享同一个方法。

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
<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>
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】

五.动态原型方式

  在构造函数中通过标志量让所有对象共享一个方法,而每个对象拥有自己的属性。

JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
<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>
JavaScript学习12 JS中定义对象的几种方式【转】
JavaScript学习12 JS中定义对象的几种方式【转】
 
分类: html5基础
上一篇:openfalcon微信报警


下一篇:我的javascript学习之路(一)对象之基础