每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。 私有变量、函数 在具体说prototype前说几个相关的东东,可以更好的理解prototype的设计意图。之前写的一篇JavaScript 命名空间博客提到过JavaScript的函数作用域,在函数内定义的变量和函数如果不对外提供接口,那么外部将无法访问到,也就是变为私有变量和私有函数。 function Obj(){ var a=0; //私有变量 JavaScript中的`prototype`属性是面向对象编程的关键特性之一,它关联了函数(特别是构造函数)与实例之间的继承关系。每个函数都有一个`prototype`属性,这个属性是一个对象,包含了所有实例共享的方法和属性。当我们使用`new`操作符调用一个函数作为构造函数时,新创建的对象会从原型对象中继承属性和方法。 私有变量和函数在JavaScript中是通过函数作用域实现的。例如: ```javascript function Obj() { var a = 0; // 私有变量 var fn = function() {}; // 私有函数 } ``` 在这个例子中,`a`和`fn`只在`Obj`函数内部可见,外部或其实例都无法访问它们。 静态变量和函数是直接在函数对象上定义的属性和方法,这些属性和方法可以通过函数对象访问,但不是实例的一部分: ```javascript function Obj() {} Obj.a = 0; // 静态变量 Obj.fn = function() {}; // 静态函数 ``` 实例变量和函数是在构造函数内部通过`this`关键字定义的,它们在对象实例化后可以被访问: ```javascript function Obj() { this.a = []; // 实例变量 this.fn = function() {}; // 实例方法 } ``` 实例变量和函数是每个实例特有的,它们在不同的实例之间是独立的。然而,对于引用类型的实例变量(如数组和对象),修改实例的属性会影响到自身,不会影响到其他实例。 为了解决实例方法的冗余复制问题,JavaScript引入了`prototype`。每个函数的`prototype`属性实际上是一个对象,它包含了所有实例应该继承的方法。当创建一个新对象时,这个新对象会有一个内部链接(通常名为`__proto__`)指向构造函数的`prototype`。这样,所有的实例都可以共享这些方法,而不需要每个实例都保存一份副本: ```javascript function Person() {} Person.prototype.name = "John"; // 在prototype上定义方法或属性 ``` 现在,任何通过`Person`构造函数创建的实例都可以访问`name`属性,即使它们自己并没有定义这个属性。 ```javascript var person1 = new Person(); person1.name = "Jane"; console.log(person1.name); // Jane var person2 = new Person(); console.log(person2.name); // John ``` 总结起来,JavaScript的`prototype`属性是用来实现对象的继承和共享方法的关键机制。通过在构造函数的`prototype`上定义方法,可以避免每个实例都存储一份相同方法的副本,从而提高内存效率。理解并掌握`prototype`的工作原理是深入学习JavaScript面向对象编程的基础。
- 粉丝: 7
- 资源: 927
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助