绝了,6种渐进方式创建js对象,第5种最流行!!

本博文源于js基础,旨在研究js创建对象方式。众所周知现在主流的语言都是比较支持面向对象机制的。而js也不例外,懂得js最基本创建对象方式,以后在大家学习《js设计模式》也是有游刃有余的。读完本篇博文大家可以轻松斩获以下创建对象方式:

  • 了解渐进方式过程及技术嬗变
  • 直接创建对象
  • 工厂模式创建对象
  • 构造函数模式创建
  • 原型模式创建对象
  • 混合模式(原型模式+构造函数模式)创建对象
  • 动态原型模式创建对象

下面的实例不需要html+css代码,纯原生态js代码,大家直接按照小标题来一步步观看,如果遇到不懂得,可以在留言区提问。代码均可完整复制,大家尽管放心

直接创建对象

这种方式早期程序员喜欢的方式,就是首先创建对象类型,然后一步步添加属性,这种弊端在于代码不封装,未来不能重用。一个对象敲多遍属性

<script>
	var person = new Object();
	person.name = "Lily";
	person.age = 19;
	person.speak = function(){
		alert( this.name + "is" + this.age + "years old");
	}
	person.speak();
</script>

如果大家以后做大型工程,看见这种直接可以询问对方:对象存在的意义何在?这就是第一种创建对象,过于直接,过于真实!

工厂模式创建对象

工厂模式是经典的设计模式种类的一种。这是为了解决上面直接创建对象的问题。这种弊端在于对象全部是object,无法正确识别你是哪种对象类型,比如:Array、Date

<script>
	function createPerson(name,age) {
		var person = new Object();
		person.name =name;
		person.age = age;
		person.speak = function(){
			alert( this.name + "is" + this.age + "years old");
		}
		return person;
	}
	var person1 = createPerson("Lily",19);	
	var person2 = createPerson("jack",19);
	person1.speak();
</script>

构造函数模式创建对象

这种方式为了解决工厂模式对象识别,大家敲过java都知道有new方式,我大js也可以。这种方式弊端在于每次创建实例时都要重新创建一次方法,而方法speak功能都相同,显得鸡肋。

<script>
	function Person(name,age) {
		this.name = name;
		this.age = age;
		this.speak = function(){
			alert( this.name + "is" + this.age + "years old");
		}
		
	}
	var person1 = new Person("Lily",19);	
	var person2 = new Person("jack",19);
	person1.speak();
</script>

原型模式创建对象

为了改变创建实例重新创建一次方法,直接是用prototype原型创建。这样,创建新对象时不用重复已有的属性、方法,节省了内存空间。这种方式弊端在于省略了构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取到了相同的属性值。简而言之:共享带来的不方便

<script>
function Person() {
		Person.prototype.name = "Lily";
		Person.prototype.age = 19;
		Person.prototype.speak = function() {
			alert( this.name + "is" + this.age + "years old");
		}
	}
	
</script>

如果验证这个弊端,大家可以创建变量同样初始化,然后比较两者是否相同,代码如下:

var person1 = new Person();
person1.speak();
var person2 = new Person();
alert(person1.speak == person2.speak);

实验结果

绝了,6种渐进方式创建js对象,第5种最流行!!_第1张图片

混合模式(原型模式+构造函数模式)

第五种创建最流行,它是将speak方法直接封装在prototype里,其余还是构造函数模式,这样带来的方便是极大的节约内存,这种模式在ECMAScript中是使用最广泛、认同度最高的一种创建自定义对象的方法。这种缺点在于,专业化搞大型工程的,为了更省内存,会将原型模式做判断,而不是将prototype声明放在构造函数外面。

<script>
	function Person(name,age) {
		this.name = name;
		this.age = age;
	}	
	Person.prototype.speak = function() {
		alert(this.name + " is " + this.age + " years old");
		
	}
	var person1 = new Person("Lily",19);
	person1.speak();
</script>

动态原型模式

这种将prototype声明放在构造函数里面,然后加以判断,更为工程规范的标准!即先判断原型中的某个属性或方法是不是已经声明过,如果没有,则声名整个类型;否则,什么也不用做

<script>
	function Person(name,age) {
		this.name = name;
		this.age = age;
		if(typeof(Person.prototype.speak) == "undefined") {
			alert("exe time");
			Person.prototype.speak = function() {
				alert(this.name + " is " + this.age + " years old");
			}
		}
	}
	var person1 = new Person();
	var person2 = new Person();
</script>

person1创建过对象之后,person2再创键,它就不执行“exe time”可谓是规范到最标准了

总结

本博文通过六种方式渐进演变如何创建js对象趋于工程化,大家仔细品味就会发现软件工程规范都是为人在考虑,只为变得更规范更标准,希望本篇博文能帮助到大家理解,每个小标题的弊端黑体字一定要认真体味,帮助大家了解什么是好的什么是坏的。
文学见识(含图灵奖历届指引)–目录
这是博主图灵奖历届指引,如果有迷茫,有缺少偶像的可以在这里获得,还在更新中,与大家一起成长!

你可能感兴趣的:(JS基础,设计模式,java,js,javascript)