一、Prototype原型 | 原型对象
1.Prototype是 [函数] 的 一个属性
2.Prototype是个对象 (可理解为可以包含变量的变量叫对象),包含应该由特定引用类型的实例共享的属性和方法。
3.当我们创建函数的时候会默认添加Prototype属性,在上面定义的方法可以被对象实例共享。
function demo() { }
//或
// let demo = function(){}
demo.prototype.name = 'lihua';
demo.prototype.name = 'lihua';
demo.prototype.age = 18;
demo.prototype.sayName = function () {
console.log(this.name);
};
let demo1 = new demo();
demo1.sayName(); //lihua
let demo2 = new demo();
demo2.sayName(); //lihua
console.log(demo1.sayName == demo2.sayName); //true
二、 __proto__ 隐式原型
1.[对象] 的属性
2.指向构造函数的prototype
3.obj.__proto__ === test.prototype
三、代码实例
function test(name) {
this.name = name;
this.a = 1
}
test.prototype.b = 2;
const obj = new test('xiaoming');
console.dir(test.prototype); //Object
console.dir(obj.__proto__); //Object
console.log(obj.__proto__ === test.prototype); //true
console.log(Object.prototype.__proto__); //null
console.dir(test.prototype.__proto__ === Object.prototype);
console.log(obj.b); //可以顺着原型链找到b
obj的__proto__指的是其构造函数test的prototype
四、原型链结构
obj{
a:1,
__proto__:test.prototype = {
b:2,
__proto__:Object.prototype = {
__proto__:null
}
}
}
五、原型链顶层是Object.prototype
Object.prototype.__proto__ 是null
`Object.prototype` 是JavaScript中所有普通对象的原型,它包含了一系列方法和属性,这些方法和属性会被所有对象实例所继承。以下是`Object.prototype`中的一些核心方法:
1. **toString**:当对象被转换为字符串时调用,通常返回"[object Object]"。
2. **valueOf**:返回对象的原始值。
3. **hasOwnProperty**:检查对象自身是否具有指定的属性(不包含原型链上的属性)。
4. **isPrototypeOf**:检查该对象是否在指定对象的原型链上。
5. **propertyIsEnumerable**:检查指定属性是否可枚举。
6. **toLocaleString**:返回对象的本地化字符串表示。
7. **constructor**:指回对象的构造函数。
除了上述方法,还有一些其他有用的方法,如`keys`、`getOwnPropertyDescriptor`、`getPrototypeOf`等。这些方法为操作对象提供了强大的能力,比如迭代对象的属性、获取和设置属性的描述符、以及获取对象的原型。
总的来说,`Object.prototype`提供的方法为JavaScript的对象系统提供了丰富的操作手段,使得对象的行为可以更加灵活地被定制和扩展。