资讯专栏INFORMATION COLUMN

js面向对象编程

zeyu / 2586人阅读

摘要:构造函数模式通过构造函数创建的对象可以通过标识对象类型,通过检测对象类型。实际上,应该说是没有办法在不影响所有对象实例的情况下,给超类型的构造函数传递参数。

==什么是对象?==
就是无序属性的集合,通过属性或者方法名与值的一一映射。
==对象的属性类型==
对象中还定义了一些js中不能直接访问的属性,是为了实现js引擎用的。有数据属性访问器属性两种。
1.数据属性
数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有 4 个描述其行为的
特性。

把新值保存在这个位置。这个特性的默认值为 undefined。

要修改属性默认的特性,必须使用 ECMAScript 5 的 Object.defineProperty()方法。


注意:
1》 configurable 设置为 false,表示不能从对象中删除属性。如果对这个属性调用 delete,则 在非严格模式下什么也不会发生,而在严格模式下会导致错误。而且,一旦把属性定义为不可配置的, 就不能再把它变回可配置。
2》在调用 Object.defineProperty()方法时,如果不指定,configurable、enumerable 和 writable 特性的默认值都是 false。
2.访问器属性
访问器属性不包含数据值;包含一对儿 getter 和 setter 函数(不过,这两个函数都不是必需的)。 在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效的值;在写入访问器属性时,会调用 setter 函数并传入新值,这个函数负责决定如何处理数据。访问器属性有如下 4 个特性。

 [[Get]]:在读取属性时调用的函数。默认值为 undefined。
 [[Set]]:在写入属性时调用的函数。默认值为 undefined。
访问器属性不能直接定义,必须使用 Object.defineProperty()来定义。

可以通过Object.definePro- perties()定义多个属性;
使用 ECMAScript 5 的 Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。

==创建对象的方式==
通过字面量的方式可以创建对象,但是创建有类似属性的对象时会产生大量重复代码。
1.工厂模式
用函数来封装以特定接口创建对象。


缺点就是无法知道一个对象的类型。
2.构造函数模式


通过构造函数创建的对象可以通过constructor标识对象类型,通过instanceof检测对象类型。
构造函数模式与工厂模式对比:
1》没有显式地创建对象;
2》直接将属性和方法赋给了 this 对象;
3》 没有 return 语句。
通过new操作符调用构造函数会经历4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象);
(3) 执行构造函数中的代码(为这个新对象添加属性);
(4) 返回新对象。


构造函数也可作为普通函数调用
Person("Greg", 27, "Doctor"); // 添加到window window.sayName(); //"Greg"
也可以在另一个对象的作用域中调用
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse"); o.sayName(); //"Kristen"

构造函数模式的缺点就是每个方法都要在每个实例上重新创建一遍

function Person(name, age, job){

    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function("alert(this.name)"); 
    // 与声明函数在逻辑上是等价的 

}
alert(person1.sayName == person2.sayName); //false
3.原型模式


通过prototype为对象添加属性和方法。这样实例就能共享原型的属性和方法。
1》原型具有动态性。在实例化后定义的原型方法,实例也能调用。

2》原型的简单写法。

可以将原型简写如上,但是这种写法实际上是重新写了原型,新原型的constructor已经改变,指向object。所以可以重新设置constructor。
而且如果在实例化后重写原型,则已经实例的对象依旧访问原来原型对象,不能访问新原型的方法和属性。

组合使用构造函数模式和原型模式

===继承===

继承:利用原型让一个引用类型继承另一个引用类型的属性和方法。

1.原型链继承

包含引用类型值的原型属性会被所有实例共享;而 这也正是为什么要在构造函数中,而不是在原型对象中定义属性的原因。在通过原型来实现继承时,原型实际上会变成另一个类型的实例。于是,原先的实例属性也就顺理成章地变成了现在的原型属性了。
原型链的问题是:由于原型中包含引用类型值所带来的问题。和在创建子类型的实例时,不能向超类型的构造函数中传递参数。实际上,应该说是没有办法在不影响所有对象实例的情况下,给超类型的构造函数传递参数。实践中很少会多带带使用原型链。

2.构造函数继承

借用构造函数:别忘了,函数只不过是在特定环境中执行代码的对象, 因此通过使用 apply()和 call()方法也可以在(将来)新创建的对象上执行构造函数。

借用构造函数的问题
如果仅仅是借用构造函数,那么也将无法避免构造函数模式存在的问题——方法都在构造函数中定 义,因此函数复用就无从谈起了。而且,在超类型的原型中定义的方法,对子类型而言也是不可见的,结 果所有类型都只能使用构造函数模式。考虑到这些问题,借用构造函数的技术也是很少多带带使用的。

组合继承

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为 JavaScript 中最常用的继 承模式。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105307.html

相关文章

  • 体验javascript之美6:如果你觉得什么都会了或者不知道js学什么了看这里-面向对象编程

    摘要:面向过程函数式编程面向对象编程第二个并不是大家理解的那样,我们先说举个现实例子就明白了。多说一句函数是编程是非常强大也是我最喜欢的,以后再说,我们先说面向对象编程。 概述 当大家已经把js的语言基础理解了,然后能够写出一些简单的例子了,这个时候基本上达到了一年工作经验的水平,而自己能够独立的写一些小功能,完成一些小效果,或者临摹修改一些比较复杂的插件的时候差不多就是两年工作经验的水平,...

    changfeng1050 评论0 收藏0
  • js面向对象编程的理解

    摘要:构造函数对象初始化的瞬间被调用的方法。接下来看下自己做的一个小例子面向对象编程大家好这是一辆它的颜色是它的内饰是牧马人越野车绿色的简约精致的法拉利跑车红色的豪华舒畅的效果图注构造函数始终都应该以一个大写字母开头。 js的面向对象编程的理解 面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装、继承、多态的特性!但JS中对象...

    wuaiqiu 评论0 收藏0
  • 解决js面向对象编程的难题

    摘要:一面向对象编程简介定义,简称,是一种程序设计思想。好处维护简单模块化是面向对象编程中的一个特征。可扩充性面向对象编程从本质上支持扩充性。 一、面向对象编程简介 1.定义: Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 2.好处: (1)、维护简单:模块化是面向对象编程中的一个...

    ermaoL 评论0 收藏0
  • JS中的面向对象编程

    摘要:一面向对象编程面向对象编程是一种抽象方式创建模型的编程方式。继承我们实现一个子类,继承汽车类将类的属性和方法赋值给继承汽车类的原型链创建子类实例以上是中的面向对象编程的简单介绍,如有错误,欢迎指出。 一.面向对象编程面向对象编程(OOP--Object Oriented Programming)是一种抽象方式创建模型的编程方式。继承,封装,多态是OOP的三大基本特征。许多主流编程语言都...

    lunaticf 评论0 收藏0

发表评论

0条评论

zeyu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<