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

Posted 张凯::get("新技能")

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
JS面向对象

 

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>
复制代码
复制代码
 
分类: html5基础

以上是关于JavaScript学习12 JS中定义对象的几种方式的主要内容,如果未能解决你的问题,请参考以下文章

JS中定义对象的几种方式

JS中定义对象的几种方式

JS中定义对象的几种方式

js中面向对象(创建对象的几种方式)

创建javascript对象的几种方式

javascript对象的几种创建方式