面向对象的学习

版权声明:如果觉的本文好的话,点个赞,您的鼓励是我最大的动力。 https://blog.csdn.net/boysky0015/article/details/89081419

创建自定义对象最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法。
Object是一个函数。

var person = new Object();
person.name = 'tianxia';
person.age = 18;
person.sayName = function() {
	console.log(this.name);
}

自定义对象有两种方式
1.对象字面量语法
2.new Object()

var  person = {}
Object.defineProperty(person,'name',{
	writable: false,
	value: 'tianxia',
})
console.log(person.name);
person.name = 'xiao';
console.log(person.name);

在这里插入图片描述
6.2创建对象
1.构造函数
2.对象字面量
虽然Object构造函数或对象字面量都可以创建对象,但它的缺点在于使用同一个接口创建很多对象,会产生大量的重复代码。因此就有了工厂模式的诞生。
6.2.1 工厂模式
工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程。考虑到在ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节。

function createPerson(name,age,job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        console.log(this.name);
    }
    return o;
}
var person1 = createPerson('tianxia1',18,'web前端工程师');
person1.sayName();
var person2 = createPerson('xiaoxiao1',22,'我要成为王者');

总结:

工厂模式解决了创建多个相似对象的问题。

工厂模式存在的问题是没有解决对象识别的问题(即怎样知道一个对象的类型),随着JavaScript的发展,又又一个新模式出现了。
6.2.2 构造函数模式

function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        console.log(this.name);
    }
}
var person3 = new Person('tianxia2',18,'web前端工程师');
var person4 = new Person('xiaoxiao2',22,'我要成为王者');

Person函数和createPerson存在一下不同之处:

  1. 没有显式地创建对象;
  2. 直接将属性和方法赋给了this对象;
  3. 没有return语句。

要创建Person的新实例,必须用new操作符。以这种方式调用构造函数实际上会经历以下4个步骤:

  1. 创建一个新的对象;
  2. 将构造函数的作用域赋给新的对象(因此this就指向了这个新对象);
  3. 执行构造函数中的代码(为这个新对象添加属性);
  4. 返回新的对象。

构造函数的问题
使用构造函数的问题:就是每个方法都要在每个实例上重新创建一遍。
6.2.6 寄生构造函数模式

unction PersonX(name,age,job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        console.log(this.name);
    }
    //在这里return和不return 有什么区别呢?
    return o;
}
var personX1 = new PersonX('天下',18,'web前端');
//如果没有return 会返回{},否则的话会返回{name: "天下", age: 18, job: "web前端", sayName: ƒ}
console.log('personX1',personX1);

提问:
return和不return 有什么区别呢?
不return的话 就返回一个{}
return的话就会重写调用构造函数时返回的值。

这个模式可以在特殊的情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组。由于不能直接修改Array构造函数,因此可以使用这个模式。
6.2.7 稳妥构造函数模式

function Person123(name,age) {
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.sayName = function() {
        console.log('obj.name',obj.name);
    }
    return obj;
}

let person123 = Person123('天下',18);
person123.sayName();

稳妥构造函数其实和工厂模式非常相似,但它们毕竟是有区别的。
首先Person123是构造函数,不是普通函数
其次,不使用this。
我们来看看工厂模式的写法:

function createPerson(name,age,job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        //console.log(this.name);
    }
    return o;
}

var person1 = createPerson('tianxia1',18,'web前端工程师');
person1.sayName();

稳妥构造函数遵循与寄生构造函数类似的模式,但有两点不同:

  1. 新创建对象的实例方法不引用this;
  2. 不使用new操作符调用构造函数。

猜你喜欢

转载自blog.csdn.net/boysky0015/article/details/89081419
今日推荐