JS面向对象基础

以往写代码仅仅是为了实现特定的功能,后期维护或别人重用的时候,困难很大。

Javascript作为完全面向对象的语言,要写出最优的代码,需要理解对象是如何工作的。

1.       对象是javascript的基础,对象是一系列属性的集合,类似其他语言的散列表。

如下两个创建对象,并实现属性的例子是相同的。

var obj = new Object();
        //
给对象Obj设置一系列的属性
        obj.name = "rxm";
        obj.getAge = function()
        { return (new Date()).getFullYear() - 1986; };
        //---------------------------------------
        //
结合键值对来重写对象
        var obj = {
            name: "rxm",
            getAge: function() { return (new Date()).getFullYear() - 1986; }
        };

2.       Javascript中,对象本身可以用来创建新对象,对象也可以继承自其他对象,这称为“原型化继承”。

  <script language="javascript" type="text/javascript">

        function User(name) {

            this.name = name;

        }

        var my = new User("rxm");

        var you = new my.constructor("cwr");

        alert(my.name == "rxm"); //true

        alert(typeof my == typeof you); //true

        User("bj"); //对象上下文未设定,默认为window.

        alert(window.name); //bj

</script>

  1)公共方法

要实现在每个实例中都用到的公共方法,需了解prototype(原型)属性,这个属性包含了一个对象,此对象可以作为所有新副本的基引用。

function User(name, age) {

            this.name = name;

            this.age = age;

        }

        User.prototype.getName = function() {

            return this.name;

        }

        User.prototype.getAge = function() {

            return this.age;

        }

        var my = new User("rxm", 27);

        alert(my.getAge()); //每个实例化的对象都可以访问prototype属性添加的属性

        alert(my.getName());

2)私有方法

  只能有构造函数访问的私有函数的例子:

     function User(name, age) {

            this.name = name;

            this.age = age;

            function getName() {

                return this.name;

            }

        }

        var my = new User("rxm", 27);

my.getName(); //调用失败[运行时错误: 对象不支持此属性或方法]

   3)特权方法

      指那些在处理对象私有变量的同时,允许用公共方式访问的方法。

function User(age) {

            var year = (new Date()).getFullYear() - age;

            this.getAge = function() {

                return year;

            }

        }

        var my = new User(27);

        alert(my.getAge());//1986

        alert(my.year);//我们无法访问对象的私有属性

   动态生成代码的能力是不能小视的,能够根据运行时生成代码是十分的有用。

   //创建一个新的用户对象,接收一个有许多属性的对象作为参数

        function User(properties) {

        //遍历每一个属性,设置读取器和设置器

            for (var i in properties) {

                (function(which) {

                    var p = i;

                    which["set" + p] = function(val) {

                        properties[p] = val;

                    }

                    which["get" + p] = function() {

                        return properties[p];

                    }

                }

            )(this);

            }

        }

        var user = new User({

        name:"rxm",

        age:27 });

    alert(user.name); //没有这么个属性

    alert(user.getname()); //rxm 函数是动态生成的

alert(user.getage());//27

4)静态方法,类似C# static

      function Person(name) {

            this.name = name;

            this.getname = function()

            { return "my name is " + this.name; };

        }

        Person.mouth = 1;

        var my = new Person("rxm");

        alert(my.getname());//实例的

    alert(Person.mouth);//静态的

原文地址:https://www.cnblogs.com/hometown/p/3204218.html