JS高级程序设计-第六章:面向对象的程序设计

对象的数据属性,可以使用Object.defineProperty 方法修改和设置。Configurable, Enumerable, Writable, Value 共四个特征描述数据属性。

        //数据属性的四个特征
        var person = {
            name: 'Nicholas'
        };
        //设置为只读属性,不可修改
        Object.defineProperty(person, 'name', {
            writable: false
        });
        // person.name = 'Jane';
        // alert(person.name)  //'Nicholas'
        //设置为不可删除特性,一旦把属性定义为不可配置,之后就不能定义为可配置了。
        Object.defineProperty(person, 'name', {
            configurable: false,
            writable: true
        });
        alert(person.name);   //'Nicholas'
        delete person.name
        alert(person.name);   //'Nicholas'

构造函数
使用构造函数实现面向对象编程。

//使用构造函数创建对象
        function Person(name, age, job) {
            this.name = name;
            this.age = age;
            this.job = job;
            this.sayName = function() {
                alert(this.name)
            }
        }
        var person1 = new Person('Nicholas', 29, 'software engineering');
        alert(person1.age);
        person1.sayName()

        //将方法放在构造函数外,避免重复创建相同函数
        function Person(name, age, job) {
            this.name = name;
            this.age = age;
            this.job = job;
            this.sayName = sayName;
        }
        function sayName() {
           alert(this.name)
        }
        var person2 = new Person('Greg', 20, 'doctor')
        person2.sayName();   //Greg
        alert(person2.job)   //doctor

理解原型对象,使用hasOwnProperty检测某一属性是否是实例的属性还是原型对象的属性。

        //使用 hasOwnProperty 方法检测属性是属于实例还是原型对象
        function Person() {};
        Person.prototype.name = 'Nic  holas';
        Person.prototype.age = 29;
        Person.prototype.job = 'software engineering';

        var person1 = new Person();
        console.log(person1.hasOwnProperty('name'));  //false
        //重新在实例中定义了name属性
        person1.name = 'Greg';
        console.log(person1.hasOwnProperty('name'));  //true
        //删除实例中的name属性
        delete person1.name ;
        console.log(person1.hasOwnProperty('name'));  //false

组合使用构造函数模式和原型模式
使用构造函数定义实例属性,用原型定义共用的方法和属性。

// 使用构造函数定义实例属性,原型对象定义共有的方法和属性
        function Person(name, age, job) {
            this.name = name;
            this.age = age;
            this.job = job;
            this.friends = ['susan', 'jane']
        }
        Person.prototype = {
            constructor: Person,
            sayName: function() {
              alert(this.name)
            }
        }
        var person1 = new Person('nicholas', 28, 'software engineering');
        var person2 = new Person('gregy', 27, 'doctor');
        person1.sayName()
        // 只改变person2的朋友,person1没有改变
        person2.friends.push('john')
        alert(person2.friends)
        alert(person1.friends)

关于用原型链实现继承的几种方式,因为现在ES6已经普及,不会再用到原型链的方式,因此没有每一段代码都执行,只是粗粗看了一遍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值