2

考虑使用以下代码

function Employee() {
    this.id = "";
    this.name = "";
    this.gender = "";
}

function Programmer() {
    this.expertise = "";
}

Programmer.prototype = new Employee();

然后我想将 Programmer 进一步继承给 JScriptProgrammer,并将默认值“expertise”设置为“JavaScript”。

问:两者有什么区别

function JScriptProgrammer() {
    this.expertise = "JavaScript";
}

JScriptProgrammer.prototype = new Programmer();

function JScriptProgrammer() {
}

JScriptProgrammer.prototype = new Programmer();
JScriptProgrammer.prototype.expertise = "JavaScript";
4

4 回答 4

1

您可以将原型用于对象的默认值,并且确实可以节省内存。如果您以后不确定该属性(在实例上为其分配一个新值),那么所有实例都共享指向该值的相同指针。

但是,如果您肯定要为其分配一个值,那么最好在构造函数主体中将其定义为this.myval

这是为原型分配默认值的棘手部分;您必须重新为其分配一个新值才能进行特定于实例的更改。对象值可以通过调用它们的函数或重新分配属性来操作。当您这样做时,所有实例的默认值都会更改:

var Person=function(){};
Person.prototype.teeth=[0,1,2,3];
Person.prototype.legs={left:1,right:1};

var ben=new Person();
var betty=new Person();
ben.teeth.splice(2,1);//ben looses a tooth
//when ben looses a tooth like that betty looses it too
console.log(betty.teeth);//[1,2,3] poor betty
//now poor betty has an accident
betty.legs.right=0;
//looks like ben looses it too
console.log(ben.legs);//{left:1,right:0}
//I don't feel sorry for ben though because
//he knocked out betty's tooth

继承最好不要启动新实例,可以使用 Object.create 或辅助函数设置继承而不创建实例。所有关于继承、原型、覆盖和调用超级在这里:https ://stackoverflow.com/a/16063711/1641941

于 2013-10-04T11:19:44.453 回答
0

区别

function JScriptProgrammer() {
this.expertise = "JavaScript";
}
JScriptProgrammer.prototype = new Programmer();

意味着当您使用 JScriptProgrammer() 时,专业值已设置为“JavaScript”

但是当你使用

function JScriptProgrammer() 
{
}
JScriptProgrammer.prototype = new Programmer();
JScriptProgrammer.prototype.expertise = "JavaScript";

意味着您在使用 JScriptProgrammer() 后设置了专业值

于 2013-10-04T06:19:10.767 回答
0

他们是一样的。第二个版本节省了内存,这意味着所有的孩子都使用函数/变量的相同实例。

请参阅以下示例,该示例显示了this可能需要的原因

function JScriptProgrammer() {
   var tmp = "Hello";

   //accessing private variables
   this.sayHello = function() {
      alert(tmp + " "+ this.expertise + "er");
   }
}

JScriptProgrammer.prototype = new Programmer();
JScriptProgrammer.prototype.expertise = "JavaScript";

更多阅读

于 2013-10-04T06:58:32.567 回答
-1

在简历中:

原型用于继承现有对象。例如。如果要向 Array 对象添加新方法,可以这样做

Array.prototype.MyNewMethod = function()
{
alert("im bellow to array object")
}

这意味着你可以这样做

var array = [1,2,3];
array.MyNewMethod();//prints im bellow to array object

阅读这篇文章以获得更多参考

这意味着您的代码正在执行此操作:

        function JScriptProgrammer() {
        }
        function Programmer(){
        this.name = "hello world";
       }
        JScriptProgrammer.prototype = new Programmer();// inhering from Programmers object(or lets say class)
        JScriptProgrammer.prototype.expertise = "JavaScript"; // assigning a value to expertise property that belows to JScriptProgrammer class



console.log(new JScriptProgrammer())//JScriptProgrammer {name: "hello world", expertise: "JavaScript"} notice that property name that bellow to Programmer
 object now is in JScriptProgrammer object as well. 

这里测试http://jsbin.com/IgOFimi/1/edit

于 2013-10-04T04:56:52.653 回答