js prototype_proto_Function详解

/**
 * 所有的类都是函数数据类型的 即  所有的函数都是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__
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值