javaScript对象和原型

来源:互联网 发布:mac版百度云分享 编辑:程序博客网 时间:2024/05/16 12:09
   从事web前端近一年,谈谈我对对象和原型的理解,希望能对刚入门学习javaScript的童鞋有帮助,也欢迎大家批评指正。

对象就是一个有属性和方法的一个事物的统称,他的创建方式有以下方式。
1. var obj1 = { name:‘小明’, skill : function () alert(‘sing song’) }};(属性是一个名称,方法是一个动作即函数)
2. var obj2=new Object();(本质是构造函数,后续会讨论)

   下面说下函数对象,在JS中函数的本质就是对象,每一个函数对象创建时,都带有一个prototype属性,并且它的的值是一个拥有constructor属性,且值为该函数对象。

举个例子:function Drink(beer){this.liquor = beer}
Drink.prototype.constructor;// function Drink(beer){this.liquor = beer}
通常函数具有一个return 语句,当return被执行时,函数立即返回,不在执行余下语句,当函数没有指定返回值是,函数将会返回undefined,如果这函数作为构造函数,在构造函数前面加上new调用时,则返回这个新的this指向的对象。

 以上简单的谈下对象和函数对象,下面我们来说下原型,上边我们提到的Drink函数为一个构造函数,当我们使用new运算符,创建一个新的对象时,原型以及原型链就产生了。 var beer = new Drink('Harbin beer'); beer.liquor;//"Harbin beer"

这时Drink函数对象作为beer对象的父对象,获取子对象的父对象的方法如下:
1.beer. _ proto _;
2.var prototype = Object.getPrototypeOf(beer);
beer的 _ proto _ 指向Drink.prototype而Drink.prototype的prototype属性指向Object.prototype,最后Object.prototype没有prototype属性,Object.prototype.prototype为‘undefined’这就是原型链。

当我们在Drink.prototype或Object.prototype上定义属性和方法时,通过new运算符和构造函数创建的对象同样具有该属性和方法,这就是继承。

判断父对象是否在子对象上的原型上,有如下方法:父对象.isPrototypeOf(子对象)(注:不仅查找直接父对象,而是查找整个原型链)

看下面例子:
var s = {};
var fun = function(){};
fun.prototype = s;
s._ proto_.isPrototypeOf(fun);//true
Object.getPrototypeOf(fun);//function(){}
fun.prototype;//s
这个例子实际上并没有什么卵用,只是想说明对象之间的继承来自对象的原型之间,而不是对象本身。

1 0