一、定义函数的三种方式
- 函数声明方式 function a(){}
- 定义函数表达式方式 var a = function(){};
- 构造函数方式 var a = new Function(...arg,function){} 不推荐,但是指明了函数是对象,
二、函数是对象,那么函数名就是指针,跟包含对象指针的其他变量没有什么不同。
三、函数声明跟定义函数表达式区别
- 函数声明在解析过程中会被函数声明提前,无论何时调用都可以
- 定义函数表达式,则必须是执行到当前语句时,才会被执行。此时才可以被调用
四、arguments.callee
- callee属性是一个指针,指向拥有这个arguments对象的函数。
五、函数的属性跟方法
- 每个函数都包含的两个属性:prototype和length
- length:指的是参数个数
- prototype:保存函数所有的实例方法,例如toString()和valueOf()等方法实际上都保存在prototype名下,只不过通过各自对象实例调用而已。 是不可枚举的,所以不能被for in发现
- call和apply方法:每个函数都包含这两个非继承而来的方法。 他们都是在指定作用域中调用函数
- toLocalString()和toString()方法和valueOf()都是函数继承来的。 六、基本包装类型
- 基本包装类型的存在期只在执行的这一行,这行过去后,就会立马被销毁。因此基本包装类型没有属性跟方法
- var s = new String("nihao"); typeof(s); //"object" 对 基本 包装 类型 的 实例 调用 typeof 会 返回" object",
创建对象
一、工厂模式:用函数来封装以特定接口创建对象的细节
function createPerson( name, age, job){ var o = new Object(); o. name = name; o. age = age; o. job = job; o. sayName = function(){ alert( this. name); }; return o; } var person1 = createPerson(" Nicholas", 29, "Software Engineer"); var person2 = createPerson(" Greg", 27, "Doctor"); console.log(person3.sayName == person4.sayName); // false console.log(person3.constructor == Object); // true console.log(person3.constructor == createPerson); // false复制代码
二、构造函数模式
三、原型模式:的 每个 函数 都有 一个 prototype( 原型) 属性, 这个 属性 是一 个 指针, 指向 一个 对象, 而这 个 对象 的 用途 是 包含 可以 由 特定 类型 的 所有 实例 共享 的 属性 和 方法。 如果 按照 字面 意思 来 理解, 那么 prototype 就是 通过 调用 构造 函数 而 创建 的 那个 对象 实例 的 原型 对象。 换句话说, 不必 在 构造 函数 中 定义 对象 实例 的 信息, 而是 可以 将 这些 信息 直接 添加 到 原型 对象 中
function Person(){ } Person. prototype. name = "Nicholas"; Person. prototype. age = 29; Person. prototype. job = "Software Engineer"; Person. prototype. sayName = function(){ alert( this. name); }; var person1 = new Person(); person1. sayName(); //"Nicholas" var person2 = new Person(); person2. sayName(); //"Nicholas"复制代码
四、prototype 跟原型对象之间的关系
五、原型模式
- 对象实例可以访问保存在原型中的值,但是实例对象不能更改原型对象上的值。
- 原型 最初 只 包含 constructor 属性, 而 该 属性 也是 共享 的, 因此 可以 通过 对象 实例 访问。
- 当 为 对象 实例 添加 一个 属性 时, 这个 属性 就会 屏蔽 原型 对象 中 保存 的 同名 属性;