在这之前先说一下原型的基本知识。
什么是原型?简单来说就是一个对象内部关联另外一个对象,本质来说就是对象与对象之间的关联;
一个对象本身没有属性或者方法会到原型对象上查找。
这里每个例子会通过构造函数,class和行为委托来不同实现,不过不会评论class,是否使用class取决于你的观点。
先看一个例子,构造函数写法
function Foo(name) {
this.name = name;
}
Foo.prototype.age = function() {
console.log(this.name);
};
function Fn(name) {
Foo.call(this);
this.name = name;
}
Fn.prototype = Object.create(Foo.prototype);
Fn.prototype.constructor = Fn.prototype;
Fn.prototype.set = function(value) {
this.name = value;
};
var a1 = new Fn('zhangsan');
a1.age(); //zhangsan
var a2 = new Fn('lisi');
a2.set('xiaowu');
a2.age(); //xiaowu
class写法
class Foo {
constructor(name) {
this.name = name;
}
age() {
console.log(this.name);
}
}
class Fn extends Foo {
constructor(name) {
super();
this.name = name;
}
set(value) {
this.name = value;
}
}
var a1 = new Fn('zhangsan');
a1.age(); //zhangsan
var a2 = new Fn('lisi');
a2.set('xiaowu');
a2.age(); //xiaowu
行为委托写法
var Foo = { const(name) { this.name = name; }, age() { console.log(this.name); } }; var Fn = Object.create(Foo); Fn.set = function (value) { this.name = value; }; var a1 = Object.create(Fn); a1.const('zhangsan'); a1.age(); //zhangsan var a2 = Object.create(Fn); a2.set('xiaowu'); a2.age(); //xiaowu
可以看到比起构造函数,行为委托是通过原型链来实现的,他值关心一件事情,对象指向的关系。
再来看一个复杂一些的例子,为dom添加样式。
function Foo(value) {
this.dom = value;
}
Foo.prototype.div = function () {
var div = document.createElement(this.dom);
this._dom = document.body.appendChild(div);
return this._dom;
};
Foo.prototype.get = function () {
return this._dom;
};
function Fn(text, cssText) {
Foo.call(this, 'div');
this.text = text;
this.cssText = cssText;
}
Fn.prototype = Object.create(Foo.prototype);
Fn.prototype.constructor = Fn.prototype;
Fn.prototype.set = function () {
this.div();
var div = this.get();
div.textContent = this.text;
Object.keys(this.cssText).forEach((name) => {
div.style.cssText += `${name}: ${this.cssText[name]}`;
});
};
var a = new Fn('hi', {color: 'red', "font-size": '16px'});
a.set();
class写法
class Foo {
constructor(value) {
this.dom = value;
}
div() {
var div = document.createElement(this.dom);
this._dom = document.body.appendChild(div);
return this._dom;
}
get() {
return this._dom;
}
}
class Fn extends Foo {
constructor(text, cssText) {
super('div');
this.text = text;
this.cssText = cssText;
}
set() {
super.div();
var div = super.get();
div.textContent = this.text;
Object.keys(this.cssText).forEach((name) => {
div.style.cssText += `${name}: ${this.cssText[name]}`;
});
}
}
var a = new Fn('hi', { color: 'red', "font-size": '16px' });
a.set();
行为委托写法
var Foo = {
const(value) {
this.dom = value;
},
div() {
var div = document.createElement(this.dom);
this._dom = document.body.appendChild(div);
return this._dom;
},
get() {
return this._dom;
}
};
var Fn = Object.create(Foo);
Fn.constructor = function (text, cssText) {
this.const.call(this, 'div');
this.text = text;
this.cssText = cssText;
};
Fn.set = function () {
this.div();
let div = this.get();
div.textContent = this.text;
Object.keys(this.cssText).forEach((name) => {
div.style.cssText += `${name}: ${this.cssText[name]}`;
});
};
var a = Object.create(Fn);
a.constructor('hi', { color: 'red', "font-size": '16px' });
a.set();
注意点:
1.在使用行为委托时要避免标识符的重名,因为行为委托是基于原型链,不同于“类”的设计模式,可以构造函数与实例对象同时定义相同的名称的标识符。
2.两个委托对象无法互相委托,假设一个a对象关联b对象,然后b对象再关联a对象,如果两个引用了一个两个对象都不存在的属性或者方法,那么就会在原型链上形成无限循环。
来源:https://www.cnblogs.com/boses/p/9575247.html
classList是一个DOMTokenList的对象,用于在对元素的添加,删除,以及判断是否存在等操作。以及如何兼容操作
js的原型链,得出了一个看似很简单的结论。对于一个对象上属性的查找是递归的。查找属性会从自身属性(OwnProperty)找起,如果不存在,就查看prototype中的存在不存在。
arguments是什么?在javascript 中有什么样的作用?讲解JavaScript 之arguments的使用总结,包括arguments.callee和arguments.calle属性介绍。
WebSocket是HTML5下一种新的协议,为解决客户端与服务端实时通信而产生的技术。其本质是先通过HTTP/HTTPS协议进行握手后创建一个用于交换数据的TCP连接
HTML文档在浏览器解析后,会成为一种树形结构,我们需要改变它的结构,就需要通过js来对dom节点进行操作。dom节点(Node)通常对应的是一个标题,文本,或者html属性。
javascript中基本类型指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。 引用类型指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;第一个参数都是this要指向的对象,也就是想指定的上下文;都可以利用后续参数传参;bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
在js中有句话叫一切皆对象,而几乎所有对象都具有__proto__属性,可称为隐式原型,除了Object.prototype这个对象的__proto__值为null。Js的prototype属性的解释是:返回对象类型原型的引用。每个对象同样也具有prototype属性,除了Function.prototype.bind方法构成的对象外。
Js支持“=”、“==”和“===”的运算符,我们需要理解这些 运算符的区别 ,并在开发中小心使用。它们分别含义是:= 为对象赋值 ,== 表示两个对象toString值相等,=== 表示两个对象类型相同且值相等
js的变量分为2种类型:局部变量和全局变量。主要区别在于:局部变量是指只能在变量被声明的函数内部调用,全局变量在整个代码运行过程中都可以调用。值得注意的js中还可以隐式声明变量,而隐式声明的变量千万不能当做全局变量来使用。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!