Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.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_Javascript - Fatal编程技术网

原型函数JavaScript

原型函数JavaScript,javascript,Javascript,如果您对对象继承不感兴趣,那么在JavaScript中为对象使用原型函数有什么意义吗 换句话说,原型函数除了实现继承机制之外还有其他用途吗 …原型功能除了实现继承机制之外还有其他用途吗 我假设您指的是对象的原型属性。(JavaScript中没有“原型函数”。) 这取决于“继承”的含义。函数实例上的原型属性的目的是指定将被指定为使用该函数作为构造函数创建的对象原型的对象,例如: var f = new Foo(); // Assigns `Foo.prototype` as `f`'s proto

如果您对对象继承不感兴趣,那么在JavaScript中为对象使用原型函数有什么意义吗

换句话说,原型函数除了实现继承机制之外还有其他用途吗

…原型功能除了实现继承机制之外还有其他用途吗

我假设您指的是
对象的
原型
属性。(JavaScript中没有“原型函数”。)

这取决于“继承”的含义。
函数
实例上的
原型
属性的目的是指定将被指定为使用该函数作为构造函数创建的对象原型的对象,例如:

var f = new Foo(); // Assigns `Foo.prototype` as `f`'s prototype
这样,
f
就可以访问该原型定义的属性。如果这就是您所说的继承,那么是的,这是函数的
prototype
属性的唯一用途

请注意,现在我们有了ECMAScript 5,如果愿意,您可以使用新的
对象来分配原型,而无需使用构造函数。create

var f = Object.create(somePrototype); // Assigns `somePrototype` as `f`'s prototype
var fproto = {
    hey: function() {
        console.log("Hi, I'm " + this.name);
    }
};
var f = Object.create(fproto); // Assigns `fproto` as `f`'s prototype
f.name = "Fred";
f.hey();                       // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype
以下是这两方面更具体的例子:

使用构造函数:

function Foo(name) {
    this.name = name;
}
Foo.prototype.hey = function() {
    console.log("Hi, I'm " + this.name);
};
var f = new Foo("Fred"); // Assigns `Foo.prototype` as `f`'s prototype
f.hey();                 // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype
使用
对象。创建

var f = Object.create(somePrototype); // Assigns `somePrototype` as `f`'s prototype
var fproto = {
    hey: function() {
        console.log("Hi, I'm " + this.name);
    }
};
var f = Object.create(fproto); // Assigns `fproto` as `f`'s prototype
f.name = "Fred";
f.hey();                       // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype

因此,如果您只喜欢使用
Object.create
,并且您只使用支持ES5的引擎,那么如果您愿意,您根本不能使用
函数#prototype

与经典继承(如Java)不同,它允许您访问父级的属性

例如:

var criminal = {
           'name': 'John',
           'crime': 'Murder'
           }
criminal.name; // 'John'
var criminal2 = Object.create(criminal);
criminal2.prison = 'Famous Prison';
criminal2.name; // 'John'
criminal2.name = 'Tom';
criminal2.name; // 'Tom'
如果这有意义的话。不过,我对Java比较的看法可能是错误的

此外,您将JavaScript视为另一种语言。但事实并非如此。它是JavaScript,它没有类或继承,它是一种原型语言


你应该看看Crockford的《JavaScript:The Good Parts》。

如果你对使用JavaScript不感兴趣,有什么理由使用JavaScript吗?我假设这里有一个输入错误,因为你的第二个问题,你是说“继承”而不是“JavaScript”?原型是你创建的所有实例的共享对象,如果您有一个函数Person并使用它来创建Person(
ben=newperson(“ben”);
),那么这个Person的实例特定值将是名称ben。您不希望原型上出现这种情况,因为每个人都将被命名为Ben(直到您在实例上重写它)。但是,函数对每个Person实例的作用几乎相同,因此没有必要让每个实例都有自己的函数。对于每个实例,您通常在原型上共享一个函数。通过在原型上定义共享成员,可以更快地初始化对象并使用更少的内存来创建它们,更多信息请参见此处的简介。测试这些对象更容易,因为您可以使用模拟函数覆盖原型上的函数一次,然后创建所需数量的实例,而无需再次模拟特定的实例函数。