标签:技术 cto 创建 好的 info his 黄色 关注 http
html元素嵌套问题:
<p>
<div></div>
</p>
实际结果:display:inline-block
。本身具有inline-block的元素应该没有HTML语义化
构造函数式继承:
function Flower() //构造函数
{ this.colors = [‘黄色‘, ‘红色‘];
this.print = function () {
console.log(this.colors) }
}
function Rose() {
Flower.call(this);
} ?
var r1 = new Rose();
var r2 = new Rose(); ?
console.log(r1.print()); // [ ‘黄色‘, ‘红色‘ ]
console.log(r2.print()); // [ ‘黄色‘, ‘红色‘ ]
我们现在有一个基类Flower,它有一个属性colors,现在我们把某一个实例的colors值改一下:
r1.colors.push(‘紫色‘); ?
onsole.log(r1.print()); // [ ‘黄色‘, ‘红色‘, ‘紫色‘ ]
console.log(r2.print()); // [ ‘黄色‘, ‘红色‘ ]
结果如上,显然,改变的只有r1的值,因为通过构造函数创造出来的实例对象中,所有的属性和方法都是实例内部独立的,并不会跟其他实例共享。
原型链链式继承:
function Parent() {//列子
this.color = ‘red‘;
this.print = function() {
console.log(this.color);
}
}
function Son() { }
我们有一个父类和一个空的子类;
Son.prototype = new Parent();
Son.prototype.constructor = Son;
接着我们把子函数的原型属性赋值给了父函数的实例;
var son1 = new Son();
son1.print(); // red
最后新建子类实例,调用父类的方法,成功拿到父类的color和print属性方法;
我们重点来分析一下下面两行代码:
Son.prototype = new Parent();
Son.prototype.constructor = Son;
这段代码中,子函数的原型赋给了父函数的实例,我们知道prototype是函数中的一个属性,js的一个特性就是:如果一个对象某个属性找不到,会沿着它的原型往上去寻找,直到原型链的最后才会停止寻找。
我们看到最后实例son成功调用了Print方法,输出了color属性,这是因为son从函数Son的prototype属性上面去找到的,也就是从new Parent这个对象里面找到的;这种方式也不是真正的继承,因为所有的子实例的属性和方法,都在父类同一个实例上了,所以一旦某一个子实例修改了其中的方法,其他所有的子实例都会被影响,来看下代码:
function Flower() {
this.colors = [‘黄色‘, ‘红色‘];
this.print = function () {
console.log(this.colors)
}
} ?
function Rose() {}
Rose.prototype = new Flower();
Rose.prototype.constructor = Rose;
var r1 = new Rose();
var r2 = new Rose(); ?
console.log(r1.print()); // [ ‘黄色‘, ‘红色‘ ]
console.log(r1.print()); // [ ‘黄色‘, ‘红色‘ ] ?
r1.colors.push(‘紫色‘); ?
console.log(r1.print()); // [ ‘黄色‘, ‘红色‘, ‘紫色‘ ]
console.log(r2.print()); // [ ‘黄色‘, ‘红色‘, ‘紫色‘ ]
还是刚才的例子,这次Rose子类选择了原型链继承,所以,子实例r1修改了colors之后,r2实例的colors也被改动了,这就是原型链继承不好的地方。
标签:技术 cto 创建 好的 info his 黄色 关注 http
原文地址:https://www.cnblogs.com/tyl22/p/13215375.html