原型继承(js秘密花园,抄录笔记)
原文:http://bonsaiden.github.com/JavaScript-Garden/zh/
function Foo() { this.value = 42; } Foo.prototype = { method: function() {} }; function Bar() {} // 设置Bar的prototype属性为Foo的实例对象 Bar.prototype = new Foo(); Bar.prototype.foo = 'Hello World'; // 修正Bar.prototype.constructor为Bar本身 Bar.prototype.constructor = Bar; var test = new Bar() // 创建Bar的一个新实例 // 原型链 test [Bar的实例] Bar.prototype [Foo的实例] { foo: 'Hello World' } Foo.prototype {method: ...}; Object.prototype {toString: ... /* etc. */};
上面的例子中,test
对象从 Bar.prototype
和 Foo.prototype
继承下来;因此, 它能访问 Foo
的原型方法 method
。同时,它也能够访问那个定义在原型上的 Foo
实例属性 value
。 需要注意的是 new Bar()
不会创造出一个新的 Foo
实例,而是 重复使用它原型上的那个实例;因此,所有的 Bar
实例都会共享相同的 value
属性。
注意: 不要使用Bar.prototype = Foo
,因为这不会执行 Foo
的原型,而是指向函数 Foo
。 因此原型链将会回溯到Function.prototype
而不是Foo.prototype
,因此method
将不会在 Bar 的原型链上。
hasOwenProperty 函数
为了判断一个对象是否包含自定义属性,而不是原型链上的属性。我们需要使用继承自Object.prototype 的 hasOwenProperty 方法。
hasOwenProperty 是唯一一个处理属性但不查找原型链的函数。
// 修改Object.prototype Object.prototype.bar = 1; var foo = {goo: undefined}; foo.bar; // 1 'bar' in foo; // true foo.hasOwnProperty('bar'); // false foo.hasOwnProperty('goo'); // true
函数
函数声明
function Foo(){}
函数赋值表达式
var Foo = function(){}
变量声明提升
js会提升变量声明,这意味着var 表达式 和 function声明都会被提升到当前作用域的顶部
var bar , someValue // 缺省值是undefined function test(data){ var goo, i , e; //没有块级作用域,这些变量被移动到函数顶部 if(false){ goo = 1; }else{ goo = 2; } for(i = 0 ; i <= 100 <i ++ ){ e = data[i]; } }
匿名包裹器
引自:http://bonsaiden.github.com/JavaScript-Garden/zh/