在js面向对象思想里,所有方法都要交给不同对象来实现具体功能,那么问题来了。我们怎么来创建对象,京可能优雅的方式创建对象呢?
老夫写代码要考虑优雅?不存在的,那就一把梭!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHay = function () {
console.log('Hi')
}
}
var p1 = new Person('zs', 25);
var p2 = new Person('ss', 25);
console.log(p1.sayHay == p2.sayHay) //false
/**
* 意味着没创建一个实例对象就实例化一次
*复杂类型不会直接存值,会比较地址(也就是说是每次new都会在内存中创建新的地址)
* 十分浪费性能
* /
</script>
</body>
</html>
这就尴尬了。。。。我要是创建几十个对象,就实例化几十次?额,传出去不好听把。。。那就换一种?
第二版改进下!你不是每创建一次就实例化一次这个匿名函数么。。。那好
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function sayHello() {
console.log('sayHello')
}
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHay = sayHello
}
var p1 = new Person('zs', 25);
var p2 = new Person('ss', 25);
console.log(p1.sayHay == p2.sayHay) //true
/**
*那么问题又来了。。。
*这么干虽然我们把实例化对象提到外面,不会创建新的地址,都会指向sayHello
*但是我们这样的干法。。。。又造成了全局污染。。。想得到我们几百个对象,就要创建几百个全局方法的恐怖么。。。
*我经历过。。。
*/
</script>
</body>
</html>
那好吧,再换换思路。。。原型链,了解下~
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function sayHello() {
console.log('sayHello')
}
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHay = function () {
console.log('Hi')
}
var p1 = new Person('zs', 25);
var p2 = new Person('ss', 45);
console.log(p1.sayHay == p2.sayHay) //true
/**
*通过原型创建出来的对象可以访问原型上的任意方法
*/
</script>
</body>
</html>
好吧,,,问题就这么解决了。。。
哩个flag以后创建对象都用原型链把,,,,看以前写的代码,,脑壳痛