博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js.面向对象
阅读量:6363 次
发布时间:2019-06-23

本文共 3032 字,大约阅读时间需要 10 分钟。

一、理解对象:

第一种:基于Object对象

var person = new Object();person.name = 'My Name';person.age = 18;person.getName = function(){    return this.name;

第二种:对象字面量方式(比较清楚的查找对象包含的属性及方法)

var person = {    name : 'My name',    age : 18,    getName : function(){        return this.name;    }}

JS的对象可以使用‘.’操作符动态的扩展其属性,可以使用’delete’操作符或将属性值设置为’undefined’来删除属性。如下:

person.newAtt=’new Attr’;//添加属性alert(person.newAtt);//new Attrdelete person.age;alert(person.age);//undefined(删除属性后值为undefined);

二、对象属性类型

1、数据属性:

数据属性指包含一个数据值的位置,可在该位置读取或写入值,该属性有4个供述其行为的特性:

[[configurable]]:表示能否使用delete操作符删除从而重新定义,或能否修改为访问器属性。默认为true;  [[Enumberable]]:表示是否可通过for-in循环返回属性。默认true;  [[Writable]]:表示是否可修改属性的值。默认true;  [[Value]]:包含该属性的数据值。读取/写入都是该值。默认为undefined;如上面实例对象person中定义了name属性,其值为’My name’,对该值的修改都反正在这个位置

var person = {};Object.defineProperty(person, 'name', {    configurable: false,    writable: false,    value: 'Jack'});alert(person.name);//Jackdelete person.name;person.name = 'lily';alert(person.name);//Jack  可以看出,delete及重置person.name的值都没有生效,这就是因为调用defineProperty函数修改了对象属性的特征;值得注意的是一旦将configurable设置为false,则无法再使用defineProperty将其修改为true(执行会报错:can't redefine non-configurable property);

2、访问器属性:

它主要包括一对getter和setter函数,在读取访问器属性时,会调用getter返回有效值;写入访问器属性时,调用setter,写入新值;该属性有以下4个特征:  [[Configurable]]:是否可通过delete操作符删除重新定义属性;  [[Numberable]]:是否可通过for-in循环查找该属性;  [[Get]]:读取属性时调用,默认:undefined;  [[Set]]:写入属性时调用,默认:undefined;

访问器属性不能直接定义,必须使用defineProperty()来定义,如下:

var person = {    _age: 18};Object.defineProperty(person, 'isAdult', {    get: function () {        if (this._age >= 18) {            return true;        } else {            return false;        }    }});alert(person.isAdult?'成年':'未成年');//成年

var person = {};Object.defineProperties(person,{    _age:{        value:19    },    isAdult:{        get: function () {            if (this._age >= 18) {                return true;            } else {                return false;            }        }    }});alert(person.isAdult?'成年':'未成年');//成年

此外,使用Object.getOwnPropertyDescriptor()方法可以取得给定属性的特性:


var descriptor = Object.getOwnPropertyDescriptor(person,'_age');alert(descriptor.value);//19   对于数据属性,可以取得:configurable,enumberable,writable和value;   对于访问器属性,可以取得:configurable,enumberable,get和set

三、创建对象

使用Object构造函数或对象字面量都可以创建对象,但缺点是创建多个对象时,会产生大量的重复代码,因此下面介绍可解决这个问题的创建对象的方法

1、工厂模式

function createPerson(name, age, job) {    var o = new Object();    o.name = name;    o.age = age;    o.job = job;    o.getName = function () {        return this.name;    }    return o;//使用return返回生成的对象实例}var person = createPerson('Jack', 19, 'SoftWare Engineer'); 创建对象交给一个工厂方法来实现,可以传递参数,但主要缺点是无法识别对象类型,因为创建对象都是使用Object的原生构造函数来完成的。

2、构造函数模式

function Person(name,age,job){    this.name = name;    this.age = age;    this.job = job;    this.getName = function () {        return this.name;    }}var person1 = new Person('Jack', 19, 'SoftWare Engineer');var person2 = new Person('Liye', 23, 'Mechanical Engineer');

使用自定义的构造函数(与普通函数一样,只是用它来创建对象),定义对象类型(如:Person)的属性和方法。它与工厂方法区别在于:

转载于:https://www.cnblogs.com/GJcaowei/p/7192150.html

你可能感兴趣的文章
php中怎么导入自己写的类
查看>>
C# 委托
查看>>
Using Information Fragments to Answer the Questions Developers Ask
查看>>
JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html...
查看>>
getParameter和getAttribute的区别
查看>>
自动工作负载库理论与操作(Automatic Workload Repository,AWR)
查看>>
Redis两种方式实现限流
查看>>
CentOS 7 中使用NTP进行时间同步
查看>>
在MongoDB数据库中查询数据(上)
查看>>
Python import其他文件夹的文件
查看>>
Jvm(22),回收策略-----标记清除算法
查看>>
MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?
查看>>
UNIX 高手的 10 个习惯
查看>>
传值与传引用
查看>>
HDU 1538 A Puzzle for Pirates(海盗分金问题)
查看>>
C# Web Forms - Using jQuery FullCalendar
查看>>
H5移动端知识点总结
查看>>
Sublime-Text-2-pydocstring --- 自动生成python docstring的插件
查看>>
初涉c#设计模式-Observer Pattern-从公司管理系统删单提醒开始
查看>>
UNIX进程环境
查看>>