原型继承(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/

posted @ 2012-10-19 11:06  @电动小马达  阅读(226)  评论(0编辑  收藏  举报