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.

 

posted on 2015-10-06 17:14  HGonlyWJ  阅读(146)  评论(0编辑  收藏  举报

W3C中国
阮老师的网络日志
canvas
runoob
迷渡
并发编程网
原生JS例子
前端外刊评论