【个人笔记重点,不作为参考】主题:面向对象的程序设计

本文探讨了JavaScript中的面向对象编程,重点介绍了数据属性和访问器属性,包括configurable、enumerable、writable和value等特性,并展示了如何使用Object.defineProperty和Object.defineProperties来定义和修改属性。此外,还讲解了原型模式,包括constructor属性、原型对象的动态性和检测属性的方法。
摘要由CSDN通过智能技术生成

无序属性的集合,其属性可以包含基本值、对象或者函数。


对象的每一个属性和方法都有一个名字,而每个属性和方法都映射一个值。


重点:一个指针,只关心东西在哪里。不会关心是什么值。还有就是尽量不要破坏指针,如···指针赋予新的实例,

疑问:

1.数据属性与访问器属性怎么区分啊?为什么会有这两种?


理解对象:

一、数据属性:Object.defineProperty(object,property,descriptor) 

1.configurable 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。

2.enumberable 表示能否通过for-in循环返回属性。

3.writable 表示能否修改属性的值

4.value 包含这个属性的数据值,默认为undefine


var test = { 'name' : 'lfy' , 'sex' : '男' } ; delete test.name;   console.log(test)   /* { 'sex' : '男' } */


二、访问器属性:Object.defineProperty(object,property,descriptor) 

1.configurable 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性改为数据属性

2.enumberable 表示能否通过for-in循环返回属性。

3.get 在获取属性时调用的函数,默认undefined

4.set         在写入属性时调用的函数,默认undefined

定义单个属性

var test = {
        year: 2004
    };
Object.defineProperty(test,'newYear',{
        get : function(){
            return this.year
        },
        set: function(Anew){
           if( Anew > this.year){
            this.year = Anew;
            console.log(Anew)
           }
        }

})
test.newYear = 2006

定义多个属性

var test = {};

Object.defineProperties(test,{

name:{

writable : true;

value : 'lfy'

},

sex : {

writeable : true ; 

value : '男'

},

year : {

get :function(){

return 1996;

},

set : function(newValue){

if( newValue > 1996){

console.log(newValue)

}

else{

console.log(‘新赋予的值小于1996’)

}

}

}

})


读取属性的特性

Object.getOwnPropertyDesriptor(test,'name').configurable;


三、创建对象

3.1、工厂模式:用函数来封装以特定接口创建对象的细节。
①解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)
注:只属于Object对象
3.2、构造函数模式:定义自定义对象类型的属性和方法。
①函数名首字母大写,以此区分。
②与工厂模式不同之处:
没有显式的创建对象,
直接将属性和方法赋给this对象。
没有return语句.
③调用构造函数的步骤:
创建一个新对象
将构造函数的作用域赋给新对象(因此this就指向了这个对象)
执行构造函数中的代码(为这个对象添加属性)
返回新对象
④定义方法的不足;
每个构造函数新实例都包含一个不同的Function实例。(定义两个完成统一任务的function实例时,没有必要。)
解决办法:方法指向构造函数外面。当执行这个方法时创建的是Function实例
 该解决办法的缺点:在全局作用域创建的函数,只能被某个对象调用。如果对象定义了多个方法,要定义多个全局函数。丝毫没有封装性。

3.3、原型模式:通过调用构造函数创建的那个对象实例的原型对象

①只要创建一个函数,就会产生一个prototype属性,该属性指向函数的原型对象。  
②原型对象会自动获得一个constructor属性,该属性指向prototype属性所在的函数。
③当调用构造函数创建一个新的实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象 :  _proto_

④更简单的原型写法:以对象字面量的形式创建新对象取代(每写一个属性或方法,就要写一个prototype

不足:重新定义了prototype对象,需要在新对象里面添加属性{ constructor : <构造函数> }
  constructor的[[Enumerable]]特性,默认false,不可for-in循环。被设置为true,可for-in循环。

⑤原型的动态性:一个指针,只关心东西在哪里。不会关心是什么值。

对原型对象所做的任何修改都能够立即从实例上反映出来。(原因:将一个构造函数实例化以后,拥有构造函数的属性以及原型对象。且实力与原型对象之间的连接只不过是一个指针,所以修改原型对象,可以立即反映出来。

自翻译:

原型对象的方法:Test.prototype.isPrototypeOf(XX) Test构造函数的prototype属性指向的原型对象,是XX的原型对象。

ECMA5增加的方法:Object.getPrototypeOf(XX) 获得XX的_proto_

  Object方法:Test.hasOwnPropoty('name') 检测name属性是实例属性,还是原型属性。

  'name' in object; 存在实例中或者存在原型中,都返回true;

Object.keys(XX) 获得XX所有可枚举的实例属性。

Object.getOwnPropertyNames(XX) 获得XX所有实例属性。   如:不可枚举的constructor属性,caller等


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值