之前总是感觉对原型的理解说的不是很清楚,就知道主要是为了继承设计的。这两天又恰巧听到这个词就试着再理解一下。
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
目前的理解就是这些,或许有不对的地方,以后慢慢发觉吧:)