java能不能通过构造函数创建对象_java面向对象如何创建对象

原标题:java面向对象如何创建对象

fe2fcfd9337596d2c915abb1525d78ac.png

java作为互联网编程中使用范围最广泛的编程语言之一,我们有许多的知识是需要掌握学习的,今天武汉中软国际的老师就给大家分析讲解一下java面向对象的编程方法有哪些。

常用的创建对象的模式有以下几种:

一. 工厂模式

工厂模式抽象了具体对象的过程,用函数来封装以特ing接口创建对象的细节。

如下:

function createAnimal(name, age) {

var o = new Object();

o.name = name;

o.age = age;

o.sayName = function() {

alert(this.name);

}

return o;

}

var cat = createAnimal("cat", 12);

var dog = createAnimal("dog", 3);

工厂模式虽然解决了创建多个相似兑现过的问题,但是却没有解决对象识别的问题。

二. 构造函数模式

构造函数模式可以创建特定类型的对象。

function Animal(name, age) {

this.name = name;

this.age = age;

this.sayName = function() {

alert(this.name);

}

}

var cat = new Animal("cat", 12);

var dog = new Animal("dog", 3);

可以使用对象的constructor属性或instanceof操作符来标识对象类型。

cat.constructor == Animal // true

cat instanceof Animal // true

三. 原型模式

每个函数都有一个prototype(原型)属性。这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

使用原型对象的好处是,可以让所有对象实例共享它所包含的属性和方法。

function Animal() {}

Animal.prototype.name = "animal";

Animal.prototype.age = 1;

Animal.prototype.sayName = function() {

alert(this.name);

}

var test1 = new Animal();

test1.sayName(); // "animal"

var test2 = new Animal();

test2.sayName(); // "animal"

alert(test1.sayName === test2.sayName); // true

或者:

function Animal() {}

Animal.prototype = {

constructor: Animal,

name: "animal",

age: 1,

sayName: function() {

alert(this.name);

}

};

原型中所有属性是被很多实例共享的,通过在实例上添加一个同名属性,可以隐藏原型中的对应属性。但是,对于包含引用类型值的属性来说,问题就比较明显了,如下:

function Animal() {}

Animal.prototype = {

constructor: Animal,

name: "animal",

age: 1,

hobbies: ["dance", "sing", "play"],

sayName: function() {

alert(this.name);

}

};

var cat = new Animal();

var dog = new Animal();

cat.hobbies.push("sleep");

alert(cat.hobbies); // "dance", "sing", "play", "sleep"

alert(dog.hobbies); // "dance", "sing", "play", "sleep"

alert(cat.hobbies === dog.hobbies); // true

四. 组合使用构造函数模式和原型模式

function Animal(name, age) {

this.name = "animal";

this.age = 1;

this.hobbies = ["dance", "sing", "play"];

}

Animal.prototype = {

constructor: Animal,

sayName: function() {

alert(this.name);

}

};

var cat = new Animal("cat", 2);

var dog = new Animal("dog", 3);

cat.hobbies.push("sleep");

alert(cat.hobbies); // "dance", "sing", "play", "sleep"

alert(dog.hobbies); // "dance", "sing", "play"

alert(cat.hobbies === dog.hobbies); // false

alert(cat.sayName === dog.sayName); // true

五. 动态原型模式

function Animal(name, age) {

this.name = name;

this.age = age;

if(typeof this.sayName != "function") {

Animal.prototype.sayName = function() {

alert(this.name);

}

}

}

var cat = new Animal("cat", 12);

cat.sayName(); // "cat"

使用动态原型模式时,不能使用对象字面量重写原型。如果在已经创建了实例的情况下重写原型,那么就会切断现有实例与新原型之间的联系。

六. 寄生构造函数模式

寄生构造函数模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象。

从表面上看,这个函数很像典型的构造函数。除了使用new操作符之外,这个模式跟工厂模式长得一模一样。构造函数在不返回值的情况下,默认会返回新对象实例。而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数时返回的值。

function Animal(name, age) {

var o = new Object();

o.name = name;

o.age = age;

o.sayName = function() {

alert(this.name);

}

return o;

}

var cat = new Animal("cat", 12);

cat.sayName(); // "cat"

由于返回的对象与构造函数或构造函数的原型之间没有什么关系,因此不能依赖instanceof操作符来确定对象类型。

建议在可以使用其他模式的情况下,不能使用这种模式。

七. 稳妥构造函数模式

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

一是新创建对象的实例方法不引用this;

二是不适用new操作符调用构造函数。

function Animal(name, age) {

var o = new Object();

o.name = name;

o.age = age;

var msg = "Hello, I'm ";

o.sayName = function() {

alert(msg + this.name);

}

return o;

}

var cat = new Animal("cat", 12);

cat.sayName(); // "Hello, I'm cat"

稳妥构造函数模式适合在某些安全执行环境。

责任编辑:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值