prototype属性可以将属性和方法添加到任何对象(Number, Boolean, String 和Date等)。
注:原型(Prototype)是一个全局的属性,它可以使用在几乎所有的对象。
语法
object.prototype.name = value
实例:
这里有一个例子展示了如何使用原型(prototype)属性的属性添加到对象:
<html>
<head>
<title>User-defined objects</title>
[removed]
function book(title, author){
this.tit
JavaScript中的原型(Prototype)是理解面向对象编程的关键概念之一,它允许我们共享对象之间的属性和方法,从而提高代码的效率和可复用性。在JavaScript中,每个函数都有一个prototype属性,这个属性实际上是一个对象,当创建一个新的实例时,这个对象会成为实例的原型。
### prototype属性的使用
`prototype`属性的用途主要在于定义对象的共享属性和方法。通过设置`object.prototype.property = value`,我们可以为该对象的所有实例添加属性或方法。例如,在提供的示例中,`book`函数是一个构造函数,用于创建书籍对象。`book.prototype`被用来添加`price`属性:
```javascript
book.prototype.price = null;
```
这样,所有通过`book`构造函数创建的实例都将拥有`price`属性,即使在实例化时没有直接定义它。
### 实例化与原型链
当我们访问一个对象的属性时,JavaScript会首先在该对象自身中查找,如果找不到,则会沿着原型链向上查找,直到找到该属性或到达原型链的顶端(即`null`)。在示例中,`myBook`是一个`book`对象的实例,当我们尝试访问`myBook.price`时:
```javascript
myBook.price = 100;
```
由于`myBook`本身并没有`price`属性,JavaScript会在`book.prototype`中找到它,并赋值为`100`。因此,可以输出:
```javascript
"Book price is : " + myBook.price
```
### 原型链与继承
原型链不仅用于添加属性和方法,还是JavaScript实现继承的基础。通过将一个函数的`prototype`设置为另一个函数的实例,我们可以让一个对象继承另一个对象的属性和方法。例如:
```javascript
function Author(name) {
this.name = name;
}
book.prototype = new Author();
```
现在,所有`book`的实例都继承了`Author`的属性和方法。
### 原型对象的注意事项
1. **改变原型对象会破坏已存在的实例**:如果你在创建实例之后修改了`prototype`,那么新创建的实例将包含新的属性,但已有的实例不会受到影响。
2. **使用`__proto__`与`Object.getPrototypeOf()`**:`__proto__`是对象的一个内部属性,指向它的原型对象,但它不是标准的,推荐使用`Object.getPrototypeOf()`来获取对象的原型。
3. **`new`关键字的作用**:使用`new`关键字创建对象时,会隐式地将新对象的`__proto__`指向构造函数的`prototype`。
4. **`hasOwnProperty()`方法**:在检查对象是否拥有某个属性时,使用`hasOwnProperty()`可以避免原型链上的属性干扰。
5. **`Object.create()`**:现代JavaScript提供了`Object.create()`方法,用于创建一个新对象并将其`__proto__`设置为指定的对象,这提供了一种更安全的方式来创建对象的实例并继承属性和方法。
总结,JavaScript的原型和`prototype`属性是其动态性和灵活性的重要组成部分,它们使得我们可以轻松地实现对象间的属性和方法共享,以及实现基于原型的继承机制。在实际开发中,理解并熟练运用这些概念是至关重要的。