Javascript 经典与原型的用例

Javascript 经典与原型的用例,javascript,inheritance,Javascript,Inheritance,我有一个关于经典继承和原型继承的问题。我想看看什么更好 假设我们有一个名为familyTree的函数 function familyTree(){ this.lastname = "xyz"; } 据我所知,如果我想为它们添加任何其他详细信息,我们可以通过两种方式继承父项: 1:原型方式: 2:使用“new”关键字的经典方式 假设我想创建100个不同的中间名 什么更有意义?使用经典继承还是原型?因为使用经典可以复制所有的对象,但是使用原型可以让一切变得混乱 请举例说明什么时候应该使用经典与

我有一个关于经典继承和原型继承的问题。我想看看什么更好

假设我们有一个名为familyTree的函数

function familyTree(){
  this.lastname = "xyz";
}
据我所知,如果我想为它们添加任何其他详细信息,我们可以通过两种方式继承父项:

1:原型方式: 2:使用“new”关键字的经典方式 假设我想创建100个不同的中间名

什么更有意义?使用经典继承还是原型?因为使用经典可以复制所有的对象,但是使用原型可以让一切变得混乱


请举例说明什么时候应该使用经典与原型。

JavaScript中只有一种继承,那就是原型继承。JavaScript中不存在“经典”继承

尽管JavaScript语言有“语法糖”让那些对基于类的编程非常熟悉的OOP开发人员感到宾至如归(包括
class
关键字),JavaScript实际上并没有或没有使用类。语言词汇只是让你感到温暖和模糊

您的问题实际上并不是询问继承,而是询问属性是应该附加到构造函数还是原型

有关说明,请参见代码注释:

//创建用于创建对象实例的函数时,
//你有一个“构造函数”。按照惯例,这些职能应该
//在PascalCase中被命名是一种让别人知道他们将被命名的方式
//与“new”关键字一起用作构造函数。
函数族树(第一、中间、最后){
//因为此函数将用于创建
//FamilyTree对象,创建的每个实例都需要存储
//与其他数据不同的数据。这是通过“实例”完成的
//属性”,并通过在属性名称前加前缀来创建它们
//使用“this.”。对象将引用“this”对象
//创建实例时使用的实例变量:
this.firstName=first;
this.middleName=middle;
this.lastName=last;
}
//JavaScript对象在技术上没有“方法”——它们是
//具有存储函数的属性,函数是如何存储的
//将行为添加到对象。由于对象的行为
//通常情况下,不要在实例之间进行更改,您不应该这样做
//将它们添加到构造函数中。如果您这样做了,代码将
//工作,但每个实例都需要存储一份精确的
//同样的行为,使得对象在内存中不必要地大。
//相反,我们附加一个对象的所有实例都将执行的行为
//需要创建构造函数的原型,这样所有实例
//从构造函数创建的将继承行为,但
//实际行为只会存储一次,从而节省内存空间
//消除了一个实例表现不同的可能性
//比别人,无意中。
//实现所有FamilyTree实例将继承的“方法”:
FamilyTree.prototype.newToString=函数(名称){
返回“First name:+this.firstName+”,Last name:+this.lastName;
}
//构造函数的原型(与所有对象一样)源自“对象”
//它通过在构造函数的
//prorotype,我们将能够覆盖继承的
FamilyTree.prototype.toString=函数(名称){
返回this.lastName+“,”+this.firstName;
}
//要使用此对象,我们有几个选择,但最简单的选择是仅实例化它:
var myFamilyTree=新家族树(“约翰”、“菲茨杰拉德”、“肯尼迪”);
//现在,我们只处理实例:
console.log(myFamilyTree.firstName);
log(myFamilyTree.middleName);
console.log(myFamilyTree.lastName);
log(myFamilyTree.newToString());

log(myFamilyTree.toString())这两个都不是继承的例子,它们是向特定实例添加属性的两种不同方式。第一个示例的第一行有语法错误。JavaScript只有原型继承。第二个示例设置了两次“firstName”属性。属性应该在构造函数中定义,以便每个新实例可以存储独立于任何其他实例的值(“实例特定”)。方法应该添加到构造函数的原型中,这样函数就不必作为每个实例的一部分存储,但所有实例仍将继承该行为。行为不会因实例而改变,但数据会改变。@ScottMarcus Thanky you fixed。我的错是打字错误。那么你是不是在告诉我,我在书中读到的:只是对原型继承的一种句法上的糖分(/gimmic)?另一篇文章是不正确的?因为,在解决方案中,作者说继承分为原型继承和经典继承(因此我感到困惑)@是的。事实上,如果你阅读了参考文章中的答案,它会说:“你在问题中演示的两个代码示例都使用了原型继承。事实上,你用JavaScript编写的任何面向对象的代码都是原型继承的范例。JavaScript根本没有经典继承。”@您正在阅读的是关于一般继承类型的内容。但是,从我在那篇文章和那些文章中看到的情况来看,它们正确地表明JavaScript没有经典继承。要明白,仅仅因为语言是面向对象的,并不意味着它必须实现特定类型的继承,只是它必须支持某种类型的继承。@TechnoCorner我刚刚阅读了你链接到的那篇文章,我必须说,这很清楚。我不确定您看到了什么,这让您相信JavaScript中同时存在原型继承和经典继承。谢谢
familyTree.prototype.personDetails = function(){

this.firstName = "abc";
this.middleName = "middle1";

 var newToString = function(name){ //overwriting toString method
  console.log("The name is: "+name+"Middle Name is "+middleName);
 }
}
    var newPerson = new familyTree();
    newPerson.firstName = "abc";
    newPerson.middleName = "middle1";
    newperson.newToString = function (name){
     console.log("The name is: "+name+"Middle Name is "+middleName);
    }