Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我们可以添加一个属性时,为什么要使用prototype_Javascript - Fatal编程技术网

Javascript 当我们可以添加一个属性时,为什么要使用prototype

Javascript 当我们可以添加一个属性时,为什么要使用prototype,javascript,Javascript,我有一个javasctipt类 function employee(name, jobtitle, born) { this.name = name; this.jobtitle = jobtitle; this.born = born; } var fred = new employee("Fred Flintstone", "Caveman", 1970); employee.prototype.salary = null; fred.salary = 20000;

我有一个javasctipt类

function employee(name, jobtitle, born)
{
    this.name = name;
    this.jobtitle = jobtitle;
    this.born = born;
}

var fred = new employee("Fred Flintstone", "Caveman", 1970);
employee.prototype.salary = null;
fred.salary = 20000;
fred.notprototype = 1239;
console.log(fred);
现在您可以看到,我使用prototype添加了salary属性,但我只是使用
fred.notprototype=1239添加了一个属性不使用原型


当我在对象fred上运行console.log时,我在那里看到了notprototype。那么不添加原型是错误的吗?如果是,那么它有什么区别呢?

原型上的属性做两件事:

  • 对于“普通”变量,它们可以提供默认值,当您第一次将同名属性写入对象时,默认值将被隐藏

  • 对于成员函数,它们减少了包含该函数自身副本的对象的每个实例的开销


  • 原型上的属性有两个作用:

  • 对于“普通”变量,它们可以提供默认值,当您第一次将同名属性写入对象时,默认值将被隐藏

  • 对于成员函数,它们减少了包含该函数自身副本的对象的每个实例的开销


  • 比方说,在所有代码之后,您添加了以下内容:

    var john = new employee("John Carson", "Philantropist", 2015);
    console.log(john);
    
    它将显示
    john
    具有
    salary
    属性(值
    null
    )。这不是你自己设定的,它来自原型链

    通过添加到
    X
    的原型,可以更改由
    new X()
    创建的所有对象

    另一个例子:

    function School(name)
    {
        this.name = name;
    }
    
    School.prototype.getName = function() {
        return this.name;
    }
    
    var school_one = new School('one');
    
    console.log(school_one.getName()); // prints "one"
    
    在本例中,向原型添加了一个方法
    getName
    。创建
    school\u one
    对象时,它继承自
    school.prototype
    您添加到其中的所有内容(在本例中,仅此方法)

    这可用于声明对象的接口(用于访问它的方法)或与构造函数分离的默认值


    为了更深入地了解JavaScript及其独特功能,我强烈建议您查看以下视频:;他是一位伟大的演说家,学识渊博,喜欢听他的演讲:)

    假设,在所有这些代码之后,您添加了以下内容:

    var john = new employee("John Carson", "Philantropist", 2015);
    console.log(john);
    
    它将显示
    john
    具有
    salary
    属性(值
    null
    )。这不是你自己设定的,它来自原型链

    通过添加到
    X
    的原型,可以更改由
    new X()
    创建的所有对象

    另一个例子:

    function School(name)
    {
        this.name = name;
    }
    
    School.prototype.getName = function() {
        return this.name;
    }
    
    var school_one = new School('one');
    
    console.log(school_one.getName()); // prints "one"
    
    在本例中,向原型添加了一个方法
    getName
    。创建
    school\u one
    对象时,它继承自
    school.prototype
    您添加到其中的所有内容(在本例中,仅此方法)

    这可用于声明对象的接口(用于访问它的方法)或与构造函数分离的默认值


    为了更深入地了解JavaScript及其独特功能,我强烈建议您查看以下视频:;他是一位伟大的演说家,学识渊博,喜欢听他的演讲:)

    嗯,不-当你向原型中添加一些东西时,它会立即在该类型的所有对象中变得可访问。通过添加到X的原型中,你会从那时起更改由new X()创建的所有对象。你能举个例子吗?我有点困惑that@Alnitak啊对,更新了,;在给原型添加相同的属性之前,他添加了
    .salary
    属性,所以我的脑电波变得混乱;-)谢谢@Autolycus我通过展示
    john
    示例强调了这一点;它将有一个
    .salary
    属性,因为您将其添加到了原型中(原型与普通属性不同,它们在JavaScript中有特殊的含义)@Autolycus我已经更新了答案,希望这能让它更清晰一些,否-当您向原型添加某些内容时,该类型的所有对象都会立即访问该对象。通过向X的原型添加内容,您可以从该点开始更改new X()创建的所有对象。你能举个例子吗?我有点困惑that@Alnitak啊对,更新了,;在给原型添加相同的属性之前,他添加了
    .salary
    属性,所以我的脑电波变得混乱;-)谢谢@Autolycus我通过展示
    john
    示例强调了这一点;它将有一个
    .salary
    属性,因为您将它添加到了原型中(原型与普通属性不同,它们在JavaScript中有特殊的含义)@Autolycus我已经更新了答案,希望这能让它更清楚一些