宝哥软件园

向我学习javascript的原型原型和原型链

编辑:宝哥软件园 来源:互联网 时间:2021-09-22

使用过JavaScript的同学一定对原型了如指掌,但初学者对它是什么却不能达成一致。他们只知道所有的函数都有一个原型属性,可以为其添加函数进行实例访问。其他人不清楚。最近看了一些JavaScript高级编程,它们的奥秘终于揭开了。

每个函数都有一个原型属性,它是对一个对象的引用,这个对象被称为原型对象。原型对象包含函数实例共享的方法和属性,也就是说,当函数用作构造函数调用(用new运算符调用)时,新创建的对象将从原型对象继承属性和方法。与传统的面向对象语言不同,Javascript的继承机制是基于原型而不是类。

1.私有变量和函数在具体讲原型之前,先说几个相关的东西,可以更好的理解原型的设计意图。在了解JavaScript的原型链之前,有必要先了解JavaScript的范围链。JavaScript的函数作用域,函数中定义的变量和函数,如果不对外提供接口,将无法对外访问,即成为私有变量和私有函数。

函数Obj(){ var a=0;//私有变量var fn=function(){//private function } }这样一来,变量a和函数fn就不能在函数Object Obj之外访问,它们变成私有的,只能在Obj内部使用,即使是函数Obj的实例仍然不能访问这些变量和函数。

var o=new Obj();console . log(o . a);//undefinedconsole . log(o . fn);//undefined2,静态变量,函数。

定义函数时,属性和函数由“.”添加仍然可以通过对象本身进行访问,但是不能访问它的实例。这样的变量和函数分别称为静态变量和静态函数。使用过Java和C#的同学,对静态的含义都有很好的理解。

function Obj(){ } Obj . a=0;//Static变量obj . fn=function(){//Static function } console . log(obj . a);//0 console . log(type of Obj . fn);//function var o=new Obj();console . log(o . a);//undefinedconsole . log(type of o . fn);//undefined3,实例变量,函数。

在面向对象编程中,除了一些库函数之外,我们在定义对象的时候还是要同时定义一些属性和方法,实例化之后可以访问,JavaScript也可以。

function Obj(){ this . a=[];//实例变量this . fn=function(){//instance method } } console . log(type of Obj . a);//undefinedconsole . log(type of Obj . fn);//undefinedvar o=new Obj();console . log(o . a的类型);//objectconsole.log(类型为o . fn);//功能这可以达到上述目的,但是,

function Obj(){ this . a=[];//实例变量this.fn=function(){ //实例方法} } var O1=new Obj();O1 . a . push(1);O1 . fn={ };console . log(O1 . a);//[1]console.log(类型为O1 . fn);//object var O2=new Obj();console . log(O2 . a);//[]console . log(O2 . fn的类型);//函数上面的代码完全按照预期运行,但它也显示了一个问题。a和fn在o1中被修饰,但在o2中没有改变。由于数组和函数都是Objects和reference两种类型,这说明o1和o2中的属性和方法不是引用,虽然它们有相同的名称,但它们是obj对象定义的属性和方法的副本。

这对于属性来说不是问题,但是对于方法来说是一个大问题,因为方法都在执行完全相同的功能,但是它们被复制成两个副本。如果一个函数对象有几千个实例方法,那么它的每个实例都必须保留几千个方法的副本,这显然是不科学的,这是一个很大的问题。原型应运而生。先看对象的意思:

4.普通对象和功能对象。

在JavaScript中一切都是对象!但是对象也不一样。分为普通对象和功能对象。对象和函数是JS自带的函数对象。例子如下。

函数f1(){ };var F2=function(){ };var f3=新函数('

更多资讯
游戏推荐
更多+