Javascript伪经典继承与函数继承

Javascript伪经典继承与函数继承,javascript,oop,prototypal-inheritance,Javascript,Oop,Prototypal Inheritance,我最近一直在玩javascript,我正在努力掌握伪经典继承的优点(正如Crockford使用对象的原型属性所描述的)。Crockford说他很少使用它,他更喜欢函数式方法,即创建一个函数来增强像 var obj = function() { var self = {}; self.method = function() { }; return self; } 我更喜欢这种方法,它更容易理解,而且看起来很灵活 但是,我看到很多代码仍然使用prototype属性,包括jQuery

我最近一直在玩javascript,我正在努力掌握伪经典继承的优点(正如Crockford使用对象的原型属性所描述的)。Crockford说他很少使用它,他更喜欢函数式方法,即创建一个函数来增强像

var obj = function() {
  var self = {};
  self.method = function() {
  };
  return self;
}
我更喜欢这种方法,它更容易理解,而且看起来很灵活


但是,我看到很多代码仍然使用prototype属性,包括jQuery这样的流行框架。我想知道有什么好处?我对使用prototype属性的理解是,它使我们能够通过遍历prototype链来询问对象是否为特定类型。然而,作为一种动态语言,询问一个对象是否可以做一些事情,而不是它是什么,不是更好吗?

我认为两个相对重要的方面是速度和RAM使用。如果您的构造函数创建所有这些方法的新实例,这将降低代码的速度,还可能导致保留它们的外部作用域(构造函数函数),从而导致更多的RAM使用


证据:-至少在chrome中,在构造函数中执行此操作要慢89%。

我认为两个相对重要的方面是速度和RAM使用。如果您的构造函数创建所有这些方法的新实例,这将降低代码的速度,还可能导致保留它们的外部作用域(构造函数函数),从而导致更多的RAM使用


证据:-至少在chrome中,在构造函数中执行此操作的速度要慢89%。

我看到使用
原型
代替此方法的优势是效率。以“经典”方式(使用
prototype
)完成的对象的每个实例都将共享这些方法,而函数方法将为每个实例创建新方法。

我认为使用
prototype
代替这种方法的优点是效率。通过“经典”方式(使用
prototype
)完成的对象的每个实例都将共享这些方法,而函数式方法将为每个实例创建新方法。

是的,通常“最好询问对象是否可以做某事,而不是它是什么”(有时称为“duck typing,”因为如果一个物体看起来像鸭子,嘎嘎叫起来像鸭子。不过,有时您确实想知道对象是否是数组,而不仅仅是具有长度属性的对象

然而,当您创建大量对象时,原型或伪经典方法也具有性能优势

使用伪经典方法重写方法也容易得多。参见。

是的,通常“最好询问对象是否能做某事,而不是它是什么”(有时称为“鸭子打字”,因为如果对象看起来像鸭子,并且像鸭子一样嘎嘎……)。不过,有时您确实想知道对象是否是数组,而不仅仅是具有长度属性的对象

然而,当您创建大量对象时,原型或伪经典方法也具有性能优势


使用伪经典方法重写方法也容易得多。请参见。

人们使用原型是因为它是一个继承结构

如果要从另一个对象继承方法和属性,则必须使用原型

var Proto = {
  method: function () { }
}

var obj = function() {
  return Object.create(Proto);
}

人们使用原型是因为它是一个继承结构

如果要从另一个对象继承方法和属性,则必须使用原型

var Proto = {
  method: function () { }
}

var obj = function() {
  return Object.create(Proto);
}

使用委托原型和使用伪经典继承之间有一个重要的区别。原型继承依赖于为委托设置原型,在Object.create()之前,唯一的方法是设置构造函数的prototype属性。既然我们有了Object.create(),出于同样的目的,我使用它而不是构造函数

使用委托原型的主要原因是通过在委托给该原型的所有实例之间共享相同的函数内存来节省资源

var Proto = {
  method: function () { }
}

var obj = function() {
  return Object.create(Proto);
}

您列出的示例称为工厂函数,它经常与Object.create()结合使用,以实现方便的原型继承。

使用委托原型与使用伪经典继承之间有一个重要区别。原型继承依赖于为委托设置原型,在Object.create()之前,唯一的方法是设置构造函数的prototype属性。既然我们有了Object.create(),出于同样的目的,我使用它而不是构造函数

使用委托原型的主要原因是通过在委托给该原型的所有实例之间共享相同的函数内存来节省资源

var Proto = {
  method: function () { }
}

var obj = function() {
  return Object.create(Proto);
}

您列出的示例称为工厂函数,它经常与Object.create()结合使用,以实现方便的原型继承。

在此处查看速度,并检查javascript原型继承在此处查看速度,所有关于javascript原型继承的检查我明白了,所以通过使用原型,您只定义一次继承,通过函数方法,继承在每个实例化上定义?我明白了,因此,通过使用prototype,您只需定义一次继承,通过函数式方法,继承在每个实例化上定义?这不是唯一的方法。还可以使用串联。另外,您可以混合使用任意数量的原型:obj=function(){return}.extend({},proto,Backbone.Events);};这不是唯一的办法。还可以使用串联。另外,您还可以混合使用任意数量的原型:obj=function(){return}