、简单对象的创建 使用对象字面量的方式{}
创建一个对象(最简单,好理解,推荐使用),代码如下
2、用 function(函数)来模拟 class
2.1) 创建一个对象,相当于 new 一个类的实例(无参构造函数),代码如下
2.2)可以使用有参构造函数来实现,这样定义更方便,扩展性更强(推荐使用)代码如下
3、使用工厂方式来创建(Object 关键字)
代码如下:
4、使用原型对象的方式 prototype 关键字
代码如下:
5、混合模式(原型和构造函数)
代码如下:
6、动态原型的方式(可以看作是混合模式的一种特例)
代码如下:
以上几种,是 javascript 中最常用的创建对象的方式
avaScript创立目标的办法有许多,经过Object结构函数或目标字面量的办法也能够创立单个目标,明显这两种办法会产生很多的重复代码,并不适合量产。接下来介绍七种十分经典的创立目标的办法,他们也各有优缺陷。
1、工厂办法
function createPerson(name, job) { var o=new Object()
能够无数次调用这个工厂函数,每次都会回来一个包括两个特点和一个办法的目标
工厂办法虽然处理了创立多个相似目标的疑问,可是没有处理目标辨认疑问,即不能知道一个目标的类型
结构函数办法
function Person(name, job) { this.name=name this.job=job this.sayName=function() { console.log(this.name)
没有显现的创立目标,运用new来调用这个结构函数,运用new后会主动履行如下操作
创立一个新目标
这个新目标会被履行[[prototype]]链接
这个新目标会绑定到函数调用的this
回来这个目标
运用这个办法创立目标能够查看目标类型
person1 instanceof Object // true person1 instanceof Person //true
可是运用结构函数创立目标,每个办法都要在每个实例上从头创立一次
2、原型办法
function Person() {
将信息直接增加到原型目标上。运用原型的优点是能够让一切的实例目标同享它所包括的特点和办法,不用在结构函数中界说目标实例信息。
原型是一个十分重要的概念,在 一篇文章看懂 proto 和prototype的关系及区别 中讲的十分具体
3、更简略的写法
function Person() {
将Person.prototype设置为等于一个以目标字面量办法创立的目标,可是会致使 .constructor 不在指向Person了。
运用这种办法,彻底重写了默许的Person.prototype目标,因而 .constructor 也不会存在这儿
Person.prototype.constructor===Person // false
假如需求这个特点的话,能够手动增加
function Person() {
不过这种办法还是不够好,应为constructor特点默许是不可枚举的,这么直接设置,它将是可枚举的。所以能够时分,Object.defineProperty办法
Object.defineProperty(Person.prototype, 'constructor', {
缺陷
运用原型,一切的特点都将被同享,这是个很大的优点,同样会带来一些缺陷
原型中一切特点实例是被许多实例同享的,这种同享关于函数十分适宜。关于那些包括基本值的特点也牵强能够,究竟实例特点能够屏蔽原型特点。可是引证类型值,就会出现疑问了
function Person() {
friends存在与原型中,实例person1和person2指向同一个原型,person1修正了引证的数组,也会反应到实例person2中
4、动态原型办法
动态原型办法将一切信息都封装在了结构函数中,初始化的时分,经过查看某个应当存在的办法时分有效,来决议是不是需求初始化原型
function Person(name, job) { // 特点 this.name=name this.job=job // 办法 if(typeof this.sayName !=='function') {
只需在sayName办法不存在的时分,才会将它增加到原型中。这段代码只会初次调用结构函数的时分才会履行。
尔后原型现已完结初始化,不需求在做什么修正了
这儿对原型所做的修正,能够当即在一切实例中得到反映
其次,if句子查看的可所以初始化以后应当存在的任何特点或办法,所以不用用一大堆的if句子查看每一个特点和办法,只需查看一个就行
5、保险结构函数办法
首要理解保险目标指的是没有公共特点,并且其办法也不引证this。
保险目标最适合在一些安全环境中(这些环境会禁止运用this和new),或避免数据被别的应用程序改动时运用
保险结构函数办法和寄生办法相似,有两点不相同:一是创立目标的实例办法不引证this,而是不运用new操作符调用结构函数
function Person(name, job) { var o=new Object()
和寄生结构函数办法相同,这么创立出来的目标与结构函数之间没有什么关系,instanceof操作符对他们没有意义
6、寄生结构函数办法
这种办法的基本思想即是创立一个函数,该函数的效果仅仅是封装创立目标的代码,然后再回来新建的目标
function Person(name, job) { var o=new Object()o.name=nameo.job=jobo.sayName=function() { console.log(this.name)} return o} var person1=new Person('Jiang', 'student')person1.sayName()
这个办法,除了运用new操作符并把运用的包装函数叫做结构函数以外,和工厂办法简直相同
结构函数假如不回来目标,默许也会回来一个新的目标,经过在结构函数的结尾增加一个return句子,能够重写调用结构函数时回来的值
7、组合运用结构函数办法和原型办法
这是运用最为广泛、认同度最高的一种创立自界说类型的办法。它能够处理上面那些办法的缺陷
运用此办法能够让每个实例都会有自个的一份实例特点副本,但同时又同享着对办法的引证
这么的话,即便实例特点修正引证类型的值,也不会影响别的实例的特点值了
function Person(name) { this.name=name this.friends=['Shelby', 'Court']}Person.prototype.sayName=function() { console.log(this.name)} var person1=new Person() var person2=new Person()person1.friends.push('Van') console.log(person1.friends) //["Shelby", "Court", "Van"] console.log(person2.friends) // ["Shelby", "Court"] console.log(person1.friends===person2.friends) //false
如有错误请大家及时提出,见谅!!
function Person(name, age, job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); }; return o; } var person=Person("Greg", 27, "Doctor"); person.sayName();// Greg 工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即不能知道一个对象的类型)
function Person(name, age, job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(this.name); }; } var person=new Person("Greg", 27, "Doctor"); person.sayName();// Greg 构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头
function Person(){ } Person.prototype.name="Nicholas"; Person.prototype.age=29; Person.prototype.job="Software Engineer"; Person.prototype.sayName=function(){ alert(this.name); }; var person=new Person(); person.sayName();//Nicholas 对于原型模式理解就是,每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
var person=new Object(); person.name="Nicholas"; person.age=29; person.job="Software Engineer"; person.sayName=function(){ alert(this.name); }; person.sayName();//Software Engineer
var person={ name: "Nicholas", age: 29, job: "Software Engineer", sayName: function(){ alert(this.name); } }; person.sayName();//Nicholas
*请认真填写需求信息,我们会在24小时内与您取得联系。