试着说明js中的原型

之前总是感觉对原型的理解说的不是很清楚,就知道主要是为了继承设计的。这两天又恰巧听到这个词就试着再理解一下。

js语言中有原型的设计。
设计原型的目的(或者说最大的作用)就是为了实现继承。
继承:一个对象,或者说实例a使用一个方法,如果没有定义,它会追溯到原型上去寻找。换而言之,在实例的原型上定义方法可以实现实例上的方法共用。


伪代码例子。

构造函数:A.prototype.b = function foo(){console.log(“方法”)}
实例:a.foo() // “方法”


在js中每一种数据类型(基础类型,引用类型)的值都是通过构造函数来构造。
数字1 通过 构造函数Number()
字符串“1” 通过 构造函数String ()
数组[] 通过构造函数Array()
对象{} 通过构造函数Object()
func()通过构造函数Function()
每一种值都是构造函数的实例
实例可以通过__proto__访问到构造函数的prototype属性

所有的函数均有一个prototype属性,这个属性的constructor指向实例,除了Function.prototype.bind()
所以也会发现
Function.,proto=== Function.prototype

其实,这个继承关系是引擎自己创建的。
由于js面向对象的设计思想,Object.prototype为最原型最顶层,指向null,
然后又创建了Function.prototype,将其指向Object.prototype
这应该是设计上的缺陷,或者说是一个没办法的办法
因为所有的实例都需要构造函数来创建,构造函数本质上是函数,所以引擎就创建了Function.prototype,然后由Function.prototype来创建function Function() 这个函数的构造函数。


实例通过new 方法创建
建议通过字面量方法创建 a = 一个任意类型值,这样虽然内部引用new创建实例,但是性能和可读性会更高。

new方法原理
a = new A 之后
new一个新对象a
a连接到构造函数
a__proto__指向构造函数A的prototype
构造A通过apply绑定this为实例a并接收剩余参数执行
返回实例a


给对象添加方法的时候可以通过Object.defineProperty

var obj={};
Object.defineProperty(obj,"name",{
    configurable:false,
    enumerable:false,
    writable:false,   //1
    value:"mooshine",//1
    get:function() {//2
        return this.vv;
    },
    set:function(){//2
        this.vv="mooshine";
    }
});
//选1不能选2

目前的理解就是这些,或许有不对的地方,以后慢慢发觉吧:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值