2012-01-28 88 views
1

我正在研究一种扩展方法,以在JavaScript中创建对象和函数的子类型。我正在努力了解这两条线是如何不同的:JavaScript继承扩展方法提示

  • f.prototype = p;
  • f.prototype = new p();

我能解释幕后发生了什么吗?

我的理解是当我传入一个对象时,如果我使用'new p();'调用的构造函数可能不存在。它是否正确?有没有办法整合这些代码?

function extend(p) { 
     if (p == null) throw TypeError(); 

     var f = function() {}, 
      t = typeof p; 

     if(t === 'object') { 
      f.prototype = p; 

      f.prototype.constructor = f; 
      return new f(); 

     } else if(t === 'function') { 
      f.prototype = new p(); 

      f.prototype.constructor = f; 
      return f; 
     } else { 
      throw TypeError(); 
     } 
    }  

    // ========================== 
    var Person = { 
     firstName: 'John', 
     lastName: 'Doe' 
    }; 
    console.log('Person: ', Person); 

    var Employee = extend(Person); 
    Employee.prototype = { 
     employeeID: 0 
    } 

    console.log('Employee: ', Employee); 

    var Manager = extend(Employee); 
    Manager.prototype.fireEveryone = function() { 
     alert('Everyone is fired!!!!'); 
    } 
    console.log('Manager: ', Manager); 

感谢

+0

我刚刚得到了过去的这个问题[这可能帮助。](http://stackoverflow.com/a/13072338/1257652) – 2012-10-25 15:56:33

回答

0

虽然我也太会热切地等待着看到回复张贴到这个问题的答案,我建议你看看在ECMAScript中5,推出了新的继承/ OOP机制,我就JavaScript而言,思考工作更协调一致。

这里更多:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperties https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create

+0

Golmaal,我实际上是在发布之前看看这些...然后看到这个:[link](http://kangax.github。 com/es5-compat-table /) 我正在使用不支持ECMAScript 5的IE8。 – Daniel 2012-01-29 01:55:18