原型方法有什么意义?


10

我正在阅读Javascript:The Good Parts,并努力使自己了解原型部分。

经过一番谷歌搜索后,我得出的结论是,在对象声明之后向对象添加属性。

使用从w3schools闪闪发光的此脚本时,我注意到删除添加原型属性的行无效。那有什么意义呢?


//Prototyping

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; //  <---  try removing this line
fred.salary=20000;

document.write(fred.salary);


4
@Raynos说得很好,但也建议替换,例如MDN docs:developer.mozilla.org/en/JavaScript
StuperUser 2011年

Answers:


13

那不是原型的工作方式。原型用于原型链。

每当您尝试在对象上获取属性时,都会检查该对象的属性名称。如果不存在,它将在原型中查找。

例:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

因此,原型的重点只是代码的重用和继承。


好吧,现在我明白了。但是我还是动态添加的属性,它告诉我prototype is undefined---o.prototype.newProp = "mutts nuts";
轻度发子

3
@MildFuzz o是一个对象。该.prototype属性用于函数,请忽略它。只是做o.newProp = "mutts nuts"
雷诺斯2011年

7

完成后,fred.salary=20000您仅将薪金属性添加到fred。使用原型时,您将随后创建的所有员工都将具有薪金属性。

假设您有100个雇员实例,并且您想向所有雇员添加薪金属性。您可以手动操作它,遍历每个员工并添加它。或者,您可以使用原型并为所有原型进行设置。

当您想对已经存在的东西发挥功能时,原型非常有用。假设您要向数组添加自定义方法。您将执行以下操作:

Array.prototype.my_custom_method = function() {...}

从那里开始,您将创建的所有数组都将具有该方法。


3
令我惊讶的是,没有人提到这是为了减少内存使用。如果您需要实现一个包含大量代码的复杂对象,则不希望在该对象的每个实例中重复这些代码。显然,每个实例中的数据属性都可能不同,但是通常只需要一个代码副本,因此将其放在原型中。
Dominic Cronin'9

1
海事组织,这是迄今为止最好的答案。
松饼人2012年

5

您可能想看一下这篇文章

基于原型的语言具有原型对象的概念,该对象用作模板,从模板获取新对象的初始属性。任何对象都可以在创建对象时或在运行时指定其自己的属性。此外,任何对象都可以关联为另一个对象的原型,从而允许第二个对象共享第一个对象的属性。

如果将属性添加到用作一组对象原型的对象,则为其原型的对象也会获得新属性。

与基于类的语言相比,这是基于原型的语言的主要优势之一。

另外,如果需要,使用JS可以很容易地获得经典的OO继承,但是通常很难为没有默认实现的语言获取原型模型。


3
针对基于类和基于原型的语言的文章+1
2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.