/*【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 */