/** * JavaScript 是面向对象的语言,但是他的面向对象不是基于类的,是基于原型的; * 但是他的一些特性(函数是数据),使得它可以模拟基于类的面向对象,但是 JavaScript 并不支持和 Java 一样的类, * 因此 JavaScript 中的"类"可以称作"伪类" */ // /** * 构造函数: js 中用来和 new 运算符一起使用的函数称作构造函数 * * 构造函数通常没有返回值,构造函数初始化作为 this 的值传递来的对象,并且没有返回值; * * 然而,一个构造函数是允许返回一个对象的值的,并且,如果他这么做,返回的对象成为 new 表达式的值; * 在此情况下,作为 this 的值的对象将会被抛弃。 * [ jQuery 中的 jQuery.fn.init 构造函数有返回值 ] */ // function User( name, age){ this.name = name; this.age = age; // return; // 返回 this // return null; // 返回 this // return this; // return []; // 返回 [] // return function(){}; // 返回 这个 function,抛弃 this // return false; // 返回 this // return new Boolean( false); // 返回新 boolean;抛弃 this // return 'hello world'; // 返回 this // return new String( 'hello world'); // 返回 新建的 string,抛弃 this // return 2; // 返回 this // return new Number( 32); // 返回新的 number,抛弃 this } var me = new User( 'myhere', 23); /** * new 运算符的工作过程 * 1, 创建一个空对象 * 2, 设置这个对象的原型;一个对象的原型就是他的构造函数的 prototype 属性的值。 * 所有的函数都有一个 prototype 属性,当这个函数被定义的时候,prototype 属性自动的创建和初始化。 * prototype 属性的初始化值是一个对象,这个对象只有一个属性,就是 constructor,他指回到和原型相关联的那个构造函数 * 3, 将这个空对象作为 this 的值传递给构造函数来执行这个构造函数,及用构造函数初始化对象 * 4, 构造函数是否有 return 语句 有 return 语句: (具体情况见上面例子) 是否 return 一个对象(注意必须是对象) 是:则使用这个对象作为 new 表达式的值 否:忽略 return 语句返回构造函数初始化的对象 无 return 语句: 返回 this */ // // /** * 所有函数都有一个 prototype 属性 * 每个对象都有一个 constructor 属性,他引用了初始化这个对象的构造函数 */ /** * 关于 for/in 语句 * 1, for/in 语句遍历属性时顺序是无规则的 * 2, for/in 循环并不会遍历所有对象的所有可能的属性; 对象的有些属性以相同的方式标记成了只读的、永久的(不可删除的) 或者 不可列举的,这些属性使用 for/in 循环不能枚举出来。 虽然所有的用户自定义属性都可以枚举,但是许多内部属性,包括所有内部方法都是不可枚举的。 */