【JavaScript】面向对象

JS(JavaScript)
一.面向对象;
概述;

  • 面向对象是什么;

是运用一系列对象相互协作软件设计,目的是在编程中增进更好灵活性和可维护性,依附对模块化注重,面向对象代码开辟更简朴,轻易明白
面向对象的有重要特征是1.封装;2.继续;3.多态

  • 封装;

封装重要用于叙说对象中所包括(封装)的内容,由两部分构成
相干的数据(贮存属性)
这些数据所能做的事变

  • 继续;

是指类和类之间的关联,如两个类都有雷同的属性和要领,那末个中一个类并能够继续另一个类,如许不需要再次定义一样的属性和要领
建立一个或多个类专门类体式格局称为继续,有两个类个中一个叫子类,另一个是叫做父类

  • 多态;

差别的对象能够定义有雷同称号要领,要领是作用地点对象中,差别对象雷同要领挪用各自行为能力则为多态
如A对象有sayMe()要领,B对象继续A对象,而B对象也有具有sayMe()要领,sayMe()要领时,并不知道该要领A对象照样B对象,且不影响代码一般事情
2.组织函数;

  • 组织函数;

组织函数称为组织器和对象模版是对象的一饿要领,组织器被挪用,在
JS(JavaScript)中函数能够作为组织器运用,,并不需要定义个组织器要领

  • 组织函数的属性;

就是对象的变量,一个对象包括多个属性,定义组织函数属性是运用this关键字

  • 组织函数的要领;

该要领,很想组织函数属性,差别是要领是个函数(或像函数一样定义)定义组织函数属性是运用this关键字

  • this关键字

有套完整差别于别的语言对this处置惩罚机制,this关键字自身没有任何意义

/*
    用于建立对象(属性和要领)
    function 组织函数称号(){
        this.属性名 = 属性值;
        this.要领名 = function(){
            要领体
        }
    }
    this关键字-指代应用当前组织函数建立的对象
 */
function Hero(name){
    this.name = name;
    this.sayMe = function(){
        console.log('我是' + name);
    }
}
// 应用组织函数建立对象
var hero = new Hero('犬夜叉');
console.log(hero);

var obj = {
    name : '犬夜叉',
    sayMe : function(){
        console.log('我是犬夜叉');
    }
}

二.Object范例;
1.操纵对象的属性;

  • 设置属性描述符value;

是该属性所对应值,能够是怎样有用的JS(JavaScript)值(数值,对象,函数)为默认值undefined

var obj = {
    // 定义对象的同时定义了该属性以及值(可修正、可删除以及可罗列的)
    name : '犬夜叉'
}

Object.defineProperty(obj, 'name', {
    value : '桔梗'
});
console.log(obj.name);// 桔梗
/*
    一样都是为对象新增属性
    1.假如直接运用 "对象名.属性名 = 值" -> 可修正、可删除以及可罗列的
    2.假如运用Object.defineProperty()要领新增属性
      * 该新属性是不可修正、不可删除以及不可罗列的
 */
Object.defineProperty(obj, 'age', {
    value : 16
});
console.log(obj.age);// 16

var result1 = Object.getOwnPropertyDescriptor(obj, 'age');
console.log(result1);
// 一旦属性的值是不可修正的 - 假如实行修正操纵时 -> 没有语法报错,然则无效
obj.age = 80;
console.log(obj.age);// 16

obj.job = '妖狐';
var result2 = Object.getOwnPropertyDescriptor(obj, 'job');
console.log(result2);
  • 设置属性描述符writable;

当该属性为true时,value才被赋值运算符所转变,默以为false

var obj = {
    // 定义对象的同时定义了该属性以及值(可修正、可删除以及可罗列的)
    name : '犬夜叉'
}
// 修正现有属性
Object.defineProperty(obj, 'name', {
    value : '桔梗',
    writable : false // 不可修正
});
console.log(obj.name);// 桔梗
// 修正name属性值
obj.name = '戈薇';
console.log(obj.name);// 桔梗

Object.defineProperty(obj, 'age', {
   value : 18,
   writable : true
});
console.log(obj.age);// 16
// 修正age属性值
obj.age = 80;
console.log(obj.age);// 80
// 删除age属性值
delete obj.age;
console.log(obj.age);// undefined
  • 设置属性描述符configurable;

该属性为true时,该属性描述符才转变,同时会从雷同的对象中被删除,默以为false

var obj = {
    // 定义对象的同时定义了该属性以及值(可修正、可删除以及可罗列的)
    name : '犬夜叉'
}
// 修正现有属性
Object.defineProperty(obj, 'name', {
    value : '桔梗',
    writable : true, // 掌握当前属性是不是可被修正
    configurable : true // 掌握当前属性是不是可被删除
});
console.log(obj.name);// 桔梗
// 修正name属性值
obj.name = '戈薇';
console.log(obj.name);// 桔梗
// 删除name属性值
delete obj.name;
console.log(obj.name);// 桔梗
  • 设置属性描述符enumerable;

该属性为true时,属性才出现在对象罗列属性中,默以为false

var obj = {
    // 定义对象的同时定义了该属性以及值(可修正、可删除以及可罗列的)
    name : '犬夜叉'
}
Object.defineProperty(obj, 'name', {
    value : '桔梗',
    enumerable : false
});
console.log(obj.name);// 桔梗
/*
    属性描述符enumerable - 掌握当前属性是不是可被罗列(遍历)
    * 仅能轮回遍历对象中可被罗列的属性
      * for...in语句
      * keys()要领
    * 能够轮回遍历对象中可被罗列和不可被罗列的属性
      * getOwnPropertyNames()要领
 */
for (var i in obj) {
    console.log(i);
}
var result1 = Object.keys(obj);
console.log(result1);
var result2 = Object.getOwnPropertyNames(obj);
console.log(result2);
  • 属性描述符设置要领
var obj = {
    sayMe : function(){
        console.log('this is function');
    }
}
var result = Object.getOwnPropertyDescriptor(obj, 'sayMe');
console.log(result);

Object.defineProperty(obj, 'sayMe', {
    value : function(){
        console.log('this is new function');
    },
    writable : false
});
obj.sayMe();

obj.sayMe = function(){
    console.log('这是犬夜叉');
}
obj.sayMe();
  • 属性描述符存取器
var obj = {
    name : '犬夜叉'
}
var value;// 全局变量
Object.defineProperty(obj,'name',{// 当猎取或接见当前属性时,会挪用get要领
    get : function () {
        // 猎取指定的属性值
        console.log('Inuyasha');

         /*
          get要领在被挪用时,不能通报任何参数
          get要领在被挪用时,许可通报this关键字
          this - 示意当前的目的对象(不能挪用对象的当前目的属性)
          */
        return value;// 因为变量为初始化,挪用时能够效果为 undefined
    },
    set : function (newValue) {
        console.log('Inuyasha: ' + value);
        value = newValue;
        /*
        set要领在被挪用时,许可通报this关键字
        this - 示意当前的目的对象(不能挪用对象的当前目的属性)
         */
    }
})
console.log(obj.name);// undefined
obj.name = '桔梗';
console.log(obj.name);//桔梗

2.防改动对象;

  • 制止扩大

Object.preventExtensions()示意对象不可扩大,不能新增属性和要领
Object.isExtensible()示意推断是不是可扩大

var obj = {};
// 将对象设置制止扩大
Object.preventExtensions(obj);
// 新增属性或要领无效 -> 语法没有报错
obj.name = '犬夜叉';
console.log(obj);
/*
    Object.defineProperty()要领新增属性
    * 效果 - 报错
    * 信息 - TypeError: Cannot define property:name, object is not extensible.
 */
Object.defineProperty(obj, 'name', {
    value : '桔梗'
});
console.log(obj);

/*
    Object.isExtensible(obj)要领
    * 作用 - 用于推断指定目的对象是不是可扩大
    * 返回值
      * true - 示意指定目的对象是可扩大的
      * false - 示意指定目的哦对象是不可扩大的
 */
var result = Object.isExtensible(obj);
console.log(result);
  • 密封对象

Object.seal()示意关闭个对象,阻挠增添新属性,现有属性不可设置,
Object.isSealed()推断个对象是不是密封

var obj = {
    name : '犬夜叉' // 示意可修正
};
console.log(Object.getOwnPropertyDescriptor(obj, 'name'));

/*
    将该对象举行密封
    1.不能为该对象新增属性或要领
    2.不能修正该对象的属性或要领的描述符
      * configurable
      * enumerable
  */
Object.seal(obj);

console.log(Object.getOwnPropertyDescriptor(obj, 'name'));

/*Object.defineProperty(obj, 'age', {
    value : 16
});*/
Object.defineProperty(obj, 'name', {
    value : '桔梗',
    writable : false, // 示意不可修正
    configurable : true,
    enumerable : false
});

console.log(Object.getOwnPropertyDescriptor(obj, 'name'))

console.log(obj);

obj.name = '戈薇';
console.log(obj);
  • 凝结对象

Object.freeze()凝结个对象,不能增添新属性给该对象,也不能修正此属性值,已有属性不能删除,也不能修正此对象的属性,该要领返回被凝结对象
Object.isFrozen()推断个对象是不是被凝结

var obj = {
    name : '犬夜叉'
}
// 凝结对象
Object.freeze(obj);

/*obj.age = 16;
console.log(obj);
obj.name = '桔梗';
console.log(obj);
delete obj.name;
console.log(obj);*/

Object.defineProperty(obj, 'age', {
    value : 16
});
console.log(obj);
    原文作者:佐珥玎
    原文地址: https://segmentfault.com/a/1190000016013580
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞