/**
* 所有的类都是函数数据类型的 即 所有的函数都是Function的实例
* 每个类(函数)都具备prototype(显式原型),并且属性值是一个对象,对象中存储的是供‘对象实例’能调用的公共属性和方法
* 并且类的原型对象天生具备一个属性:constructor,指向类本身
* 每个对象(普通对象、prototype、实例、函等数)都具备:_proto_原型链,属性值是当前实例所属类的原型
* 实例._proto_ === 类.prototype
* 函数._proto_ === Function.prototype
* Object._proto_._proto_ = Object.prototype
* Function.._proto_ = Function.prototype
* Object是Function的一个实例,Function也是Object的一个实例(骚操作)
* 每个实例对象( object )都有一个私有属性(称之为 __proto__ (隐式原型))指向它的构造函数的原型对象(prototype )。
* 该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节
*
* https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Object_prototypes
*
*
* 对象数据类型
* + 普通对象、数组对象、正则对象、日期对象、类数组对象、dom对象
* + 大部分数据对象除了基本数据类型
* + 类的原型 prototype
* + 函数也是对象‘函数的三种角色’,最后会说三种角色
*
*
* JS 中创建变量的存储值有两中方案
* + 字面量方式
* + 构造函数方式
* 不论哪一种方法,创造出来的值都是所属类的实例
* 【基本数据类型值】
* + 字面量创造出来的值是基本类型
* + 构造函数创造出来的是引用数据类型
* 特殊性:Symbol和BigInt不是构造函数,不能使用new创建
* 【引用数据类型】
* + 两种创建方法的结果是一样的
*/
function Fn() {
this.x = 100;
this.y = 200;
this.getX = function () {
console.log(this.x);
}
}
Fn.prototype.getX = function () { //给原型上扩展属性方法
console.log(this.x);
}
Fn.prototype.getY = function () {
console.log(this.y);
}
Fn.prototype.getZ = function () {
console.log(y);
}
let f1 = new Fn;
let f2 = new Fn;
console.log(f1.getX == f2.getX); // false;
console.log(f1.getY == f2.getY); // true;
// f1.getX();首先看是否是自己的私有属性,如果是私有的则操作私有属性,如果不是则操作基于_proto_找所属类原型上公共的属性方法,
// 如果原型上也没有则基于原型的_proto_查找,直到找到Object.prototype为止,我们把这种查找直接称为原型链机制
// f1._proto_.getX 或者 Fn.prototype.getX 相当于跳过私有查找直接找所属类原型上公共的属性方法,f1._proto_这种模式在ie浏览器被保护起来,不允许访问
console.log(f1.__proto__.getY === Fn.prototype.getY); // true
console.log(f1.__proto__
js prototype_proto_Function详解
最新推荐文章于 2023-07-07 15:43:28 发布