Javascript :

Javascript :,javascript,methods,scope,prototype,Javascript,Methods,Scope,Prototype,原因是因为Constr.prototype===这个.\uuuuu proto\uuuuu,所以你会有同样的错误行为。我想到的是,在调用过滤器之前,过滤器的原型一直是空的。如果有人想继承过滤器原型而不首先调用过滤器,该怎么办?但我不确定这是否值得完整回答每次调用构造函数时,你都在运行所有设置原型的代码。每次调用构造函数时,它都会一遍又一遍地运行相同的赋值,所以在这方面有点浪费。也许其他人能想到这样一种情况,它实际上会导致功能问题,但我不能。@jfriend00:每次当一个人不经意地通过闭包从他的

原因是因为
Constr.prototype===这个.\uuuuu proto\uuuuu
,所以你会有同样的错误行为。

我想到的是,在调用过滤器之前,过滤器的原型一直是空的。如果有人想继承过滤器原型而不首先调用过滤器,该怎么办?但我不确定这是否值得完整回答每次调用构造函数时,你都在运行所有设置原型的代码。每次调用构造函数时,它都会一遍又一遍地运行相同的赋值,所以在这方面有点浪费。也许其他人能想到这样一种情况,它实际上会导致功能问题,但我不能。@jfriend00:每次当一个人不经意地通过闭包从他的原型方法访问本地构造函数变量时。它在单个实例的实验中工作得非常好。但是好吧…@Bergi-我不同意你的评论。您是否声称OP的第一个代码块存在特定问题?鉴于您的第一点,这是否意味着使用函数声明而不是函数表达式会更好地服务于第一个结构?好的,只要您调用
ExtendedFilter
构造函数,它就会“神奇地”调用
Filter
和方法出现在原型上。它会很好地工作,原型最初是空的对于继承来说并不重要。它不会自动调用
Filter
,除非程序员在编写
ExtendedFilter
body…(不调用可能是不好的做法,但仍然是…)。我认为这个答案不值得投否决票,因为OP问到这种做法是否会“引起开发人员的悲伤和愤怒”,我对JavaScript世界感到不舒服,因为在第一个构造函数调用之前,原型是空的。是的,在调用构造函数之前等待原型初始化是不舒服的(例如@lujcon),但不是因为继承不起作用。您的示例使用了
计数器
,说明非常精彩。非常感谢。对于代码风格的问题,IIFE是一个低效的解决方案,在这种情况下,可以删除前两行和后两行,不改变任何实际的内容,并避免一些闭包。通常,它将用于分配给Filter.prototype的功能因某些逻辑(如功能测试)而不同的情况。另一种方法是使用标签和块:
过滤器:{/*code here*/}
。或者只是评论。@RobG:是的,这个小例子不需要模块模式。然而,当代码增长时,它还有一些其他的优点;e、 g.您可以为
Filter.prototype
引入本地别名以避免重复。我会避免使用块,因为其中的函数声明在语法上是无效的。我想它会成为一个命名函数表达式,但这可能不正确。它适用于我测试过的每一个浏览器,不是一个详尽的列表,但它包括IE 6。@RobG:是的,是的。
var Filter = function( category, value ){
  this.category = category;
  this.value = value;

  // product is a JSON object
  Filter.prototype.checkProduct = function( product ){
    // run some checks
    return is_match;
  }

};
var Filter = function( category, value ){
  this.category = category;
  this.value = value;
};// var Filter = function(){...}

Filter.prototype.checkProduct = function( product ){
  // run some checks
  return is_match;
}
if(!Filter.prototype.checkProduct) {
  Filter.prototype.checkProduct = function( product ){
    // run some checks
    return is_match;
  }
}
Filter.prototype.checkProduct.apply(someFilterLikeObject, ...)
Object.create(Filter.prototype) 
var Filter = function( category, value ){
  this.category = category;
  this.value = value;

  // product is a JSON object
  this.checkProduct = function( product ){
    // run some checks
    return is_match;
  }

};
var Counter = function(initialValue){
  var value = initialValue;

  // product is a JSON object
  Counter.prototype.get = function() {
      return value++;
  }

};

var c1 = new Counter(0);
var c2 = new Counter(10);
console.log(c1.get());    // outputs 10, should output 0
function ExtendedFilter() {};
util.inherit(ExtendedFilter, Filter);
function ExtendedFilter() {};
ExtendedFilter.prototype = Object.create(Filter.prototype);
Filter.prototype.checkProduct = function( product ){
    // run some checks
    return different_result;
}

var a = new Filter(p1,p2);

a.checkProduct(product);
var Filter = (function() {

    function Filter(category, value) { // the constructor
        this.category = category;
        this.value = value;
    }

    // product is a JSON object
    Filter.prototype.checkProduct = function(product) {
        // run some checks
        return is_match;
    };

    return Filter;
}());
 function Constr(){

    const privateVar = 'this var is private';

    this.__proto__.getPrivateVar = function(){
       return privateVar;
    };

 }