JS原型与原型链
JavaScript中一切引用类型都是对象,对象就是属性的集合。
Array类型
、Function类型
、Object类型、
Date类型、
RegExp类型等都是引用类型。
原型是什么 总计一句话就是(继承里的父亲,你可以使用你的原型里的函数)
在JavaScript中,原型(Prototype)是一个非常重要的概念,它允许对象之间共享方法和属性。在JavaScript中,几乎所有的对象都是通过构造器(Constructor)函数创建的,而这些构造器函数都有一个特殊的属性,叫做prototype
。这个prototype
属性是一个对象,它包含了可以由通过该构造器函数创建的所有实例对象共享的方法和属性。总结一下:构造函数用来创建对象,同一构造函数创建的对象,其原型相同。
当你通过一个构造器函数创建一个新对象时,这个新对象内部会包含一个指向构造器函数的prototype
属性的链接(在ES6之前,这个链接通常是通过__proto__
属性来访问的,尽管__proto__
并不是一个标准属性,而是一个内部属性在大多数环境中的实现方式;从ES6开始,建议使用Object.getPrototypeOf()
和Object.setPrototypeOf()
来访问和设置这个链接)。
这个机制允许你定义一些通用的方法和属性在构造器的prototype
上,然后这些方法和属性就可以被所有通过该构造器创建的对象所共享。这是JavaScript实现继承的一种机制,尽管它与其他面向对象编程语言中的继承概念有所不同。
举个例子
function Person(name, age) {
this.name = name;
this.age = age;
}
// 在Person的prototype上添加一个方法
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
// 创建Person的实例
var person1 = new Person('Alice', 30);
var person2 = new Person('Bob', 25);
// 使用共享在prototype上的方法
person1.greet(); // 输出: Hello, my name is Alice and I am 30 years old.
person2.greet(); // 输出: Hello, my name is Bob and I am 25 years old.
// 注意:name和age属性不是共享的,每个实例都有自己的name和age属性
原型链:
当访问一个对象的属性时,先在对象的本身找,找不到就去对象的原型上找,如果还是找不到,就去对象的原型(原型也是对象,也有它自己的原型)的原型上找,如此继续,直到找到为止,或者查找到最顶层的原型对象中也没有找到,就结束查找,返回undefined
。这条由对象及其原型组成的链就叫做原型链。
1. 原型存在的意义就是组成原型链
2. 原型链存在的意义就是继承
3. 只要是引用类型都有`__proto__`属性,指向其原型。
4. 只有函数有prototype属性,指向原型对象。
static
关键字定义了静态方法或字段或静态初始化块。静态属性不能在类的实例上直接访问。相反,它们是在类本身上被访问的。
在JavaScript中,在函数上直接添加属性或方法。这些属性和方法不会通过原型链继承给实例,而是直接绑定在构造函数上。
function phone(){
}
phone.name = '111';//这里的name添加到构造函数phone上了,他并不会传递给xiaoki
let xiaoki = new phone();//这里的phone就是构造函数
xiaoki.name //这是错误的,无法调用。
xiaoki.constructor.name // 这样可以调用,但是不推荐。
phone.prototype.name = '111'// 这里的name添加到原型上了,他会传递给xiaoki
let xiaoki = new phone();//这里的phone就是构造函数
xiaoki.name //可以调用