JS原型
原型与类
类是一个抽象的,可以构造对象,就是一个抽象到具体的过程。一般用new。
原型:是一个具体到具体的过程。
使用现有的对象,去构造一个新的对象。
有两种方法从原型来构造对象。
(1) Object.create();
Object.create(proto, [propertiesObject])
- proto 一个对象,作为新创建对象的原型。
- properiesObject 对象的属性定义。
每个实例对象都有一个 __proto__属性指向原型,公用其中的方法和属性。
这个属性是一个隐私属性,不可以被修改。
<script type="text/javascript"> var A = { name : 'aaa', start : function () { console.log('%s start ', this.name); }, end : function () { console.log('%s end ', this.name); } } var aaa = Object.create(A); aaa.start(); // aaa start aaa.logo = 'first'; //创建新的属性 var bbb = Object.create(A); bbb.start(); // aaa start bbb.logo = 'second'; console.log(aaa.logo + " " + bbb.logo); // first second </script>
(2) 构造函数
函数有一个prototype属性。
使用构造函数创建对象,每个对象都有一个原型,就是prototyoe这个属性。
用new创建对象,就是构造函数
function Person (name) {
this.name = name;
}
Person.prototype = {
start :function() {
console.log('%s start', this.name);
},
run : function () {
console.log("%s is running...", this.name);
}
}
var lily = new Person('lily');
var tom = new Person('ton');
lily.run(); //lily is running...
tom.run(); //ton is running...
new 创建一个对象分为三步。
(1)首先,创建一个lily的Person的对象
(2)设置lily的_porto_的这个属性,指向Person.prototype。
(3)Person.call(lily, arguments);使用Person类去初始化lily对象。(看,这里最后还是用call来改变this创建对象的。)
型链--实例
对象的原型链从最下层的对象,到最高的Object.prototype,截至。
并且就近原则。找到最近的进行操作。
对象的操作,无论是修改还是删除属性,都不会对原型上面进行影响。
hasOwnProperty:方法,来源于Object.prototype上面。
判断传入的属性是不是对象自身的属性。
传入的属性如果返回时假,要么属性在原型上面,要么不存在。
lily.hasOwnProperty('name'); // true
lily.hasOwnProperty('logo'); // false
函数也是对象 来源于 Function() { }
而Function自己也有_proto_ , 最终指向Object.prototype.