美文网首页
编程大白话之-创建对象的构造函数方法

编程大白话之-创建对象的构造函数方法

作者: Han涛_ | 来源:发表于2019-07-21 23:40 被阅读0次

上一篇中跟大家说了构造函数,这里我们来说说创建对象,有的朋友看到题目后会想,创建一个对象并不难,我们平时最常用到的就是对象了,例如:

let obj = {}

常用定义与赋值方法obj.prop =value或者obj['prop']=value

let obj = {
            // key: value
            k: '数据',
            name: 'szc'
        } 
        obj.name = 'Hantao';
        obj['car'] = '小马';
        console.log(obj.name);          // Hantao
        console.log(obj.car);           //  小马

那么你对构造函数对象到底了解多少呢?今天来一起看下构造函数的对象,首先来了解对象的一个属性
Object.defineProperty()
通过这个方法你可以获取到对象构造函数的数据属性和访问器属性,并且可以通过设置进行对默认的属性进行修改,下面我们分别来试试这两种不同的属性

对象的构造函数.定义属性 === 数据属性

                            // '对象名', '属性'      '属性描述值'
        Object.defineProperty(object, 'property', {
            configurable: true,         // 默认:true    能否通过delete删除属性,能否修改属性的特性、能否把属性改为访问器属性
            enumerable: true,           // 默认:true      能否通过for in 遍历得到
            writable: true,             // 默认:true      是否可以修改属性的值
            value: true,                // 默认:undefined       包含这个属性的数据值
        })
        // 如果要修改对象的默认属性值,可以通过上面的方法进行修改
        // 例子:
        Object.defineProperty(obj, 'k', {
            configurable: true,
            writable: false,
        })
        obj.k = 2;
        console.log(obj)

对象的构造函数.定义属性 === 访问器属性

// Object.defineProperty(obj, 'name', {
            // configurable:  默认:true
            // enumerable:  默认:true 
            // set: 设置 
            // get: 获取
        // })
        Object.defineProperty(obj, 'name', {
            get: function() {                   // 当在下面进行获取时,get拦截到,返回一个值,获取到的值都为11  
                return '11'
            },
            set: function(val) {                // 下面重新设置时,被set拦截到,会返回一个下面设置的值
                console.log(val)
            }
        })
        console.log(obj.name)
        obj.name = 1;
        console.log(obj.name)

在这里插入一个简单的例子,可以清楚的理解我在代码中写的注释.
输入框输入,实时根据输入的内容,在下面进行显示

123.gif

        var txt = document.getElementById('txt');       // 获取input
        var app = document.getElementById('app');       // 获取div盒子
        var obj2= {                                     // 对象的k为空字符串
            html: '',
        }
        app.innerHTML = obj2.html;                      // 盒子的innerHTML为对象中的内容
        Object.defineProperty(obj2, 'html', {           // 通过访问器属性
            set: function(val) {                        // set属性获取设置的值
                app.innerHTML = val;                    // 将获取的值赋值给盒子的innerHTML
            }
        });
        txt.oninput = function() {                      // 监听输入框的输入事件
            obj2.html = this.value;                     // 对象中的html等于触发这个事件的value值
        }

简单的说了一下这个属性,下面我们重点是要创建对象的几种模式:

1.工厂模式:
工厂模式的特点:
1.显式的创建对象
2.显式的返回一个对象
3.缺点:无法判断对象的类型

function factory(name, age, sex, car) {
            var obj = new Object();
            obj.name = name;
            obj.age = age;
            obj.sex = sex;
            obj.car = car;
            return obj;
        }
        var obj3 = factory('hyj', 18, 'girl', '汽车');
        console.log(obj3)

2.构造函数模式
构造函数模式的特点:
1.没有显式的创建对象
2.隐式返回了新的对象
3.可以判断对象类型(属于这个构造函数)
4.缺点: 因私有而冗余:所有的方法和属性都会在实例上创建一遍

function Factory(name, age, sex, car) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.car = car;
            this.eat = function(food) {
                console.log('我正在' + food);
            }
        }
        var obj4 = new Factory('szc', 22, 'boy', '自行车');
        console.log(obj4)

3.原型模式:将属性和方法都放在原型对象上
问题:
本质:因为共享的特性,导致原型上引用类型在各个实例上会影响
原型中所有属性同时被很多实例共享的
对于包含引用类型值的属性来说,会导致所有的实例都受到影响

function Ht() {
        }
        Ht.prototype.name = 'ht';
        Ht.prototype.age = '26';
        Ht.prototype.arr = [1, 2, 3];
        Ht.prototype.eat = function(food) {
            console.log('我正在' + food);
        }
        var obj5 = new Ht();
        console.log(obj5.name)
        obj5.eat('学习')

4.组合式:构造 + 原型
建议使用这种方法,集合了其它几种的优点

// 私有属性
        function People(name, age, sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
        // 共享的方法
        People.prototype.eat = function(food) {
            console.log('我正在' + food);
        }
        var obj6 = new People('ht', 28, 'boy');
        obj6.eat('学习');
        console.log(obj6.__proto__) 

这些是我常用到的几种模式,除了这些还有很多其他的方法,需要的朋友可以在网上搜索,或者本文中有哪里写错的地方,也希望大家指出。

相关文章

  • JS创建对象方法之工厂方法,构造函数方法

    JS创建对象方法之工厂方法,构造函数方法 我们在ECMAScript中创建对象虽然可以通过Object()构造方法...

  • 编程大白话之-创建对象的构造函数方法

    上一篇中跟大家说了构造函数,这里我们来说说创建对象,有的朋友看到题目后会想,创建一个对象并不难,我们平时最常用到的...

  • 链式操作

    对象字面量创建对象 构造函数创建对象 构造函数和原型一起创建对象 参考 JavaScript设计模式 --- 方法...

  • 面向对象002

    title: 面向对象编程02 创建对象 创建一个对象可以使用object构造函数或者对象字面量,但是这些方法有一...

  • 前端基础重点回顾3: 原型链、面向对象、继承

    创建对象的几种方法 字面量创建对象 使用Object构造函数创建对象 使用显式构造函数创建 是用Object.cr...

  • 创建对象的方法

    对象字面量 new Object()创建对象 工厂函数创建对象 自定义构造函数 属性和方法 new关键字 构造函数...

  • JS-对象创建

    使用函数工厂创建对象,通过参数传递对象定制的数据,内部返回包含属性和方法的对象 使用构造函数创建对象,构造函数默认...

  • 面向对象1

    一、构造函数 对象的创建方法var obj = {} plainObject 对象的字面量/对象直接量构造函数...

  • 原型链

    一、创建对象的几种方法 对象字面量 Object构造函数 构造函数 Object.create 二、原型对象、构造...

  • C++基础③new对象,继承,友元函数,函数的可变参数

    接续上篇C++基础②构造函数,析构函数,拷贝构造函数 前言 C++是一门面向对象的编程语言 , 创建用以创建对象 ...

网友评论

      本文标题:编程大白话之-创建对象的构造函数方法

      本文链接:https://www.haomeiwen.com/subject/pdcblctx.html