0

为什么没有类jordan的属性Human?难道说所有类都继承类的所有属性Coder.prototype = new Human;就足够了吗?CoderHuman

它与将功能定义为分配有关吗?

var Human = function() {
     var hi = function() {
         alert('hi');
      };
     return {
        name : 'dan',
       sayHi : hi
     };
};

var dan = new Human();

var Coder = function() {
   var code = function() {
      alert('1010101');
   };    
  return {
    code : code
  };
};

Coder.prototype = new Human;
Coder.prototype.constructor = new Coder;
var jordan = new Coder();
console.log(jordan);
4

2 回答 2

2

您的构造函数不会返回它们正在创建的对象,因此继承将不起作用。改用这个:

var Human = function() {
     this.sayHi = function() {
         alert('hi');
     };
     this.name = 'dan';
};

var dan = new Human();

var Coder = function() {
   this.code = function() {
      alert('1010101');
   };    
};

Coder.prototype = new Human;
Coder.prototype.constructor = Coder;
var jordan = new Coder();
console.log(jordan);

另一种选择,将东西从Human原型移动:

var Human = function() {};
Human.prototype.sayHi = function() {
    alert('hi');
};
Human.prototype.name = 'dan'; // will be shadowed if redefined on instances

var Coder = function() {};
Coder.prototype = Object.create(Human.prototype);
Coder.prototype.code = function() {
    alert('1010101');
};  
var jordan = new Coder();
console.log(jordan);

Object.createMDN上提供了一个polyfill

于 2013-10-04T19:26:23.403 回答
1

这是一件有趣的事情:一个 JS 构造函数可以返回一个变成 this 的对象。然而,这个对象不遵循为构造函数定义的原型(在这种情况下它是一个 plain Object)。看起来像您的代码的正确方法是:

var Human = function() {
    var hi = function() {
        alert('hi');
    };
    this.name = "dan";
    this.sayHi = hi;
};

// or even:
var Human = function() {
    this.name = "dan";
};

Human.prototype.sayHi = function() {
    alert('hi');
};

类似的Coder。继承代码没问题。

于 2013-10-04T19:26:09.043 回答