JavaScript创建对象_电源节点Java学院整理
JavaScript为每个创建的对象设置一个原型,指向它的原型对象。
当我们使用obj.xxx访问一个对象的属性时,JavaScript引擎首先会在当前对象上查找属性。如果没有找到,它会寻找它的原型对象。如果没有找到,它将返回到Object.prototype对象。最后,如果没有找到,只能返回undefined。例如,创建一个数组对象:
var arr=[1,2,3];它的原型链是:
数组.原型.对象.原型.空
Array.prototype定义了indexOf()、shift()和其他方法,因此可以直接在所有数组对象上调用这些方法。当我们创建一个函数时:
function foo(){ return 0;}函数也是一个对象,它的原型链是:
函数原型对象原型空
由于Function.prototype定义了apply()等方法,所有函数都可以调用apply()方法。
很容易认为如果原型链很长,访问对象的属性会变得更慢,因为找到它们需要更多的时间,所以我们应该注意不要让原型链太长。
构造器
除了使用直接创建对象之外.},JavaScript也可以用构造函数方法创建一个对象。它的用法是首先定义一个构造函数:
函数Student(name){ this . name=name;this . Hello=function(){ alert(' Hello,' this.name '!');}}你会问,嘿,这不是普通功能吗?
这确实是一个普通的函数,但是在JavaScript中,您可以使用关键字new调用这个函数并返回一个对象:
Var小明=新生('小明');小明.姓名;//‘小明’小明. hello();//你好,小明!注意,如果不写new,这是一个返回undefined的普通函数。但是,如果你写new,它就变成了一个构造函数,它把这个绑定到新创建的对象上,默认情况下返回这个,也就是说,你不需要在末尾写return this。
小明新打造的原型链是:
小明-学生.原型-对象.原型-空
也就是说,小明的原型指向了函数Student的原型。如果你再创作小红和小军,这些物体的原型和小明是一样的:小明小红-学生。原型-对象。原型-零小军
用新的Student()创建的对象还从原型中获取一个构造函数属性,该属性指向函数Student本身:
小明.构造函数===student . prototype . constructor;//TrueStudent . prototype . constructor===Student;//trueObject.getPrototypeOf(小明)==Student.prototype//学生真实小明实例;//真的,你头晕吗?用一张图片来表现这些杂乱的关系是:
红色箭头是原型链。注意Student.prototype指向的对象是小明和小红的原型对象,这个原型对象有一个指向Student函数本身的属性构造器。另外,函数Student恰好有一个属性原型指向小明和小红的原型对象,但是这些对象没有属性原型,但是可以用__proto__的非标准用法查看。现在我们认为小明、小红等对象是“继承”自Student。但是有一个小问题,注意观察:
小明.姓名;//‘小明’小红.名;//‘小红’小明.你好;//函数: student . hello(). Xiaohong . hello;//函数: Student.hello()小明. hello===小红. hello;//假工部萧有异名,这是正确的,否则我们分不清谁是谁。小明和小红的Hello是一个函数,但是它们是两个不同的函数,虽然函数名和代码是一样的!如果我们通过new Student()创建多个对象,这些对象的hello函数只需要共享同一个函数,就可以节省大量内存。
为了使创建的对象共享一个hello函数,根据对象属性搜索的原理,我们只需要将hello函数移动到小明和小红的公共原型,即Student.prototype:
按如下方式修改代码:
函数Student(name){ this . name=name;} student . prototype . Hello=function(){ alert(' Hello,' this.name '!');};用new创建基于原型的JavaScript对象就这么简单!
如果我忘记写新的呢
如果一个函数被定义为创建对象的构造函数,但是在调用时忘记写new了怎么办?在严格模式下,this.name=name将报告一个错误,因为这被绑定到undefined在非严格模式下,this.name=name不会报告错误,因为这是绑定到window的,所以会无意中创建全局变量名并返回undefined,结果更糟。因此,在调用构造函数时不要忘记写new。为了区分普通函数和构造函数,按照惯例,构造函数的第一个字母应该大写,而普通函数的第一个字母应该小写。通过这种方式,一些语法检查工具,如jslint,可以帮助您检测丢失的新内容。最后,我们可以编写一个createStudent()函数来封装里面的所有新操作。常见的编程模式是这样的:
函数学生(道具){这个。名称=道具。名称| |“匿名”;//默认值为‘匿名’this . grade=props . grade | | 1;//默认值为1 } student . prototype . hello=function(){ alert(' hello,' this.name '!');};函数createStudent(props){ return new student(props | | { })}这个create student()函数有几个很大的优点:第一,不需要new来调用;其次,参数非常灵活,可以传递也可以不传递:
varxiao=create student({ name : ' Xiaoming ' });小明.年级;//1如果创建的对象有很多属性,我们只需要传递一些必需的属性,剩下的属性可以使用默认值。因为参数是一个对象,所以我们不需要记住参数的顺序。如果恰好从JSON得到一个对象,可以直接创建小明。
练习
请使用构造函数定义Cat,让所有Cat对象都有一个名称属性,共享一个方法say(),返回字符串Hello,XXX!’:
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:JavaScript创建对象_电源节点Java学院整理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。