JavaScript Prototype原型属性详解与用法
本文详细解析JavaScript中构造函数特有的Prototype属性。通过Fish和Employee示例,演示如何利用prototype为实例对象添加共享属性与方法,解释__proto__内部链接机制,并说明这种方式在避免函数重复创建、节省内存方面的优势。
Prototype原型属性详解与用法
函数:原型
每个构造函数都内置了一个名为prototype的属性(下文统一使用该英文术语)。该属性在特定类中声明通用变量或函数时非常有用。
prototype的定义
无需显式声明prototype属性,因为每个构造函数中均自动存在。参考以下示例:
Example PT1
代码如下:
function Test()
{
}
alert(Test.prototype); // 输出 "Object"
给prototype添加属性
如上所示,prototype是一个对象,因此可以为其添加属性。添加到prototype的属性将成为由该构造函数创建的所有对象的共有属性。
例如,定义一个数据类型Fish,希望所有鱼对象都拥有livesIn="water"和price=20属性。为此,可以在Fish构造函数的prototype中添加这些属性。
Example PT2
代码如下:
function Fish(name, color)
{
this.name=name;
this.color=color;
}
Fish.prototype.livesIn="water";
Fish.prototype.price=20;
接下来创建几条鱼:
代码如下:
var fish1=new Fish("mackarel", "gray");
var fish2=new Fish("goldfish", "orange");
var fish3=new Fish("salmon", "white");
查看这些鱼拥有的属性:
代码如下:
for (int i=1; i<=3; i++)
{
var fish=eval_r("fish"+i); // 我只是取得指向这条鱼的指针
alert(fish.name+","+fish.color+","+fish.livesIn+","+fish.price);
}
输出结果应为:
代码如下:
"mackarel, gray, water, 20"
"goldfish, orange, water, 20"
"salmon, white water, 20"
可以看到所有鱼都拥有livesIn和price属性,即使未为每条鱼单独声明。这是因为对象创建时,构造函数将其prototype属性赋值给新对象的内部属性__proto__。对象通过__proto__查找其属性。
同样可以通过prototype为所有对象添加共用函数。其优势在于:无需每次构造对象时都创建并初始化该函数。为解释这一点,重新审视Example DT9并使用prototype重写:
用prototype给对象添加函数
Example PT3
代码如下:
function Employee(name, salary)
{
this.name=name;
this.salary=salary;
}
Employee.prototype.getSalary=function getSalaryFunction()
{
return this.salary;
}
Employee.prototype.addSalary=function addSalaryFunction(addition)
{
this.salary=this.salary+addition;
}
像往常一样创建对象:
代码如下:
var boss1=new Employee("Joan", 200000);
var boss2=new Employee("Kim", 100000);
var boss3=new Employee("Sam", 150000);
并验证:
代码如下:
alert(boss1.getSalary()); // 输出 200000
alert(boss2.getSalary()); // 输出 100000
alert(boss3.getSalary()); // 输出 150000
图示说明prototype的工作原理:每个实例(boss1, boss2, boss3)都有一个名为__proto__的内部属性,指向其构造函数(Employee)的prototype属性。执行getSalary或addSalary时,对象会在__proto__中找到并执行相应代码。注意:此处没有代码复制(与Example DT8的图表对比)。

D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
