Javascript 基础理解

复制代码
        /*【javascript核心对象包括】
        Array       表述数组。  
        Boolean     表述布尔值。  
        Date        表述日期。  
        Function    指定了一个可编译为函数的字符串 JavaScript 代码。  
        Math        提供了基本的数学常量和函数;如其 PI 属性包含了π的值。  
        Number      表述实数数值。  
        Object      包含了由所有 JavaScript 对象共享的基本功能。  
        RegExp      表述了一个正则表达式;同时包含了由所有正则表达式对象的共享的静态属性。  
        String      表述了一个 JavaScript 字符串。
        */
        
        /*【----理解apply call改变this----】
        //使用指定对象替换当前对象并调用函数
        var Henry = {
        name: 'Henry',
        age: '20'
        };
        function App() {
        this.Say = function () {
        alert('我的名字是'+this.name);
        }
        }
        App.apply(Henry);//理解:分两个步骤  ①改变this指向,并指向Henry;②执行App方法体,将App的属性、方法附加到Henry上(即Henry获得Say方法)
        Henry.Say();//Henry调用获得的Say方法
        */

        /*【----理解 new操作符----】        
        function Student(name, age) {
            this.Say = function () {
                alert("大家好,我是[" + name + "],今年[" + age + "]岁");
            }
        }
        //第一种
        //这种方式要理解  this始终指向函数(方法)的所有者 
        //函数Student的所有者就是当前页面,即window对象,所以其中的this指向window
        Student("a", 1); //给window添加函数Say
        this.Say();      //通过this(即window)调用Say
        //第二种   改变this指向 将Student附加给
        var s2 = {};
        Student.call(s2, 'c', 3); //理解:将Student的属性、方法附加到s2上  让s2来调用  并将Student中this指到s2
        s2.Say();
        //第三种 使用new的实际过程就相当于第二种
        var s = new Student('b', 2);
        s.Say();*/

        /*【---理解prototype、constructor---】
        function Person(name) {
            this.name = name;
            this.showMe = function () {
                alert(this.name);
            }
        };
        Person.prototype.from = function () {
            alert('I come from prototype.');
        };

        var one = new Person('js');

        //prototype还有一个默认的属性:constructor,是用来表示创建对象的函数的(即我们OOP里说的构造函数)。
        //constructor属性是所有具有prototype属性的对象的成员。
        //它们包括除Global和Math对象以外的所有JScript内部对象。
        //constructor属性保存了对构造特定对象实例的函数的引用。 
        alert(one.constructor); //function Person(name) {...};
        alert(one.prototype)//undefined   
        alert(typeof Person.prototype);//object   
        alert(Person.prototype.constructor);//function Person(name) {...};  
        alert(Person.constructor);  //Function(){ [native code] }*/

        /*【---原型继承---】
        //prototype,是一个对象,因此可以给它添加属性。
        //给prototype添加的属性将会成为使用这个【构造函数创建的对象】的通用属性        
        function TestObjectA() {
            this.MethodA = function () {
                alert(TestObjectA.MethodA());
            }
        }
        function TestObjectB() {
            this.MethodB = function () {
                alert(TestObjectB.MethodB());
            }
        }
        //首先new TestObjectA() 获取所有TestObjectA的所有属性,然后添加到 TestObjectB的prototype属性上
        //这样 通过TestObjectB创建的对象 就包含TestObjectA和TestObjectB两者的所有的属性 即实现继承
        TestObjectB.prototype = new TestObjectA();


        //原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,
        //工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过
        //请求原型对象拷贝它们自己来实施创建。 

        //eg:
        function RP() {
            RP.PropertyA = 1;
            RP.MethodA = function () {
                alert("RP.MethodA ");
            };

            this.PropertyA = 100;
            this.MethodA = function () {
                alert("this.MethodA");
            };
        }

        RP.prototype.PropertyA = 10;
        RP.prototype.MethodA = function () {
            alert("RP.prototype.MethodA");
        };

        var rp = new RP();
        alert(rp.PropertyA);//100
        rp.MethodA(); //this.MethodA


        rp = new RP();
        alert(RP.PropertyA); 
        RP.MethodA();
        alert(rp.PropertyA);
        rp.MethodA(); 
        */

        /*【---继承---】        
        比较项                构造继承 原型继承 实例继承 拷贝继承 
        静态属性继承          N        Y        Y        Y
        内置(核心)对象继承  N        部分     Y        Y 
        多参多重继承          Y        N        Y        N 
        执行效率              高       高       高       低 
        多继承                Y        N        N        Y
        instanceof            false    true     false    false
         */

        /*1、构造继承法:在子类中执行父类的构造函数 
        //【构造继承法没有办法继承类型的静态方法】
        function dwn(s) {
            document.write(s + "<br/>");
        }
        function Collection(size) {     //公有方法,可以被继承
            this.size = function () { return size; }
        }
        function _Collection(_size) {
            this._size = function () { return _size; }
        }
        Collection.prototype.isEmpty = function () {    //静态方法,不能被继承
            return this.size() == 0;
        }

        function ArrayList() {
            var m_elements = [];
            m_elements = Array.apply(m_elements, arguments);//实现继承 利用构造函数
            this.base = Collection;
            this.base.call(this, m_elements.length);

            this.base = _Collection;        //可实现多态继承
            this.base.call(this, m_elements.length);

            this.add = function () {
                return m_elements.push.apply(m_elements, arguments);
            }

            this.toArray = function () {
                return m_elements;
            }
        }

        ArrayList.prototype.toString = function () {
            return this.toArray().toString();
        }
        function SortedList() {
            this.base = ArrayList;
            this.base.apply(this, arguments);
            this.sort = function () {
                var arr = this.toArray;
                arr.sort.apply(arr, arguments);
            }
        }

        //        var _arr = new Array(1, 2, 3);
        //        alert(_arr.length);

//        var a = new ArrayList(1, 2, 3);
//        dwn(a);         //1,2,3
//        dwn(a.size());  //3 a从Collection继承了size()方法
//        dwn(a.isEmpty); //undefined 但是a没有继承到isEmpty()方法  【构造继承法没有办法继承类型的静态方法】
//        dwn(a._size()); //3 可以实现多态继承

        //构造一个SortedList
        var b = new SortedList(3, 1, 2);
        dwn(b.toArray());
        b.add(4, 0);
        dwn(b.toArray());
        b.sort();
        dwn(b.toArray());
        dwn(b);
        dwn(b.size());
        */

        /*2、原型继承法  
        //给prototype添加的属性将会成为使用这个【构造函数创建的对象】的通用属性
        function SuperType(_age) {
            this.Name = "SuperType";
            this.Age = _age;
        }
        SuperType.prototype.Say = function () { //静态方法,可以被继承
            alert(this.Name + "_" + this.Age);
        }
        var s = new SuperType(2);
        s.Say();
        function SubType() {
            this.Age = "22";
        }
        SubType.prototype = new SuperType(2);//实现继承
//        SubType.prototype.Say = function () {
//            alert("Subtype:" + this.Name + "_" + this.Age);
//        }
        var sub = new SubType();
        sub.Say();

        alert(sub instanceof SubType);
        alert(sub instanceof SuperType);
        */

        /*3、实例继承法
        构造函数通常没有返回值,它们只是初始化由this值传递进来的对象,并且什么也不返回。
        【如果函数有返回值,被返回的对象就成了new表达式的值。】        
        function dwn(s) {
            document.write(s + "<br/>");
        }
        function MyDate() {
            var instance = new Date();
            instance.printDate = function () {
                dwn(instance.toLocaleString());
            }
            return instance; //【如果函数有返回值,被返回的对象就成了new表达式的值。】
        }
        var date = new MyDate();
        dwn(date.toLocaleString());
        dwn(date instanceof MyDate); //false
        dwn(date instanceof Date);   //true
        //对象的构造函数将会是实际构造的对象的构造函数(new Date()),
        //而不是类型本身的构造函数(new MyDate())
        */

        /*4、拷贝继承法
        function Point(dimension) {
            this.dimension = dimension;
        }
        var Point2D = function (x, y) {
            this.x = x;
            this.y = y;
        }

        Point2D.extend = function () {
            var p = new Point(2);
            for (var each in p) {
                this.prototype[each] = p[each];
            }
        }
        Point2D.extend();
        //alert(Point2D.dimension);
        alert(Point2D.prototype.dimension);
        var p = new Point2D(1, 2);
        alert(p.dimension);
        */

        /*【---克隆---】
        浅复制(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.
        深复制(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的
        
        var DeepExtend = function (destination, source) {
            for (var pro in source) {
                var copy = source[pro];
                if (destination === copy) continue;
                if (typeof copy === "object") {
                    destination[pro] = arguments.callee(destination[pro] || {}, copy);
                } else {
                    destination[pro] = copy;
                }
            }
            return destination;
        }
        */

        /*【---闭包---】
        当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
        function a() {
            var i = 0;
            function b() {
                alert(++i);
            }
            return b;
        }
        var c = a(); //当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
        c();
        c();
        
        function x() {
            var a = 0;
            this.b = function () {
                alert(++a);
            }
        }

        var _x = new x();
        _x.b();//1
        _x.b();//2
        var _x2 = new x();
        _x2.b(); //1
        */
复制代码

 

posted @   百里水上  阅读(158)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示