JavaScript封装:javascript
var Book = function (id, name, price) { this.id = id, this.name = name, this.price = price } Book.prototype.display = function () { //展现书本 } var book = new Book(10, 'js', 30); book.display(); console.log(book.name);
问题:经过this和prototype添加的属性和方法有什么区别java
答:经过this添加的属性、方法是在当前对象上添加的,然而Js是有种基于原型prototype的语言,因此每建立一个对象时(在js中函数也是一种对象),都有一个原型prototype用于执行其继承的属性,方法。安全
javaScript是如何实现封装的呢?函数
因为javascript是函数级做用域,声明在函数内部的变量以及方法在外界是访问不到的,经过此特性便可建立类的私有变量以及私有方法。然而在函数内部经过this船舰的属性和方法,在类建立对象时,每一个对象自身都拥有一份而且能够在外部访问到。所以经过this建立的属性和方法可看做是对象共有属性和对象公有方法,而经过this建立的方法,不但能够防卫这些对象的公有属性和方法,并且还能访问到类或对象自身的私有的属性和方法,因为这些方法权力比较大,因此咱们又将它看做特权方法。在对象建立时经过使用这些特权咱们能够初始化实例对象的一些属性,所以这些在建立对象时调用的特权方法还能够看做是类的构造器,以下所示:this
var Book = function (id, name, price) { //私有属性 var num = 1; //私有方法 function checkId() { } //特权方法 this.setName = function (name) { } this.getName = function () { } //对象公有属性 this.id = id; this.name = name; this.price = price; //对象公有方法 this.copy = function () { } //4对象构造器 this.setName('name'); }
类的静态方法和属性spa
//类的静态属性 Book.isChinese=true; //类的静态方法 Book.resetTime=function(){}
类的原型属性和方法prototype
//公有方法 Book.prototype.display = function () { //展现书本 } //公有属性 Book.prototype.checkId=true;
建立对象的安全模式:code
目的是克服初学者忘记new关键字,致使以下示例,这是因为new关键字的做用是对当前对象的this不停的赋值,然而例子中没有使用new,因此就会直接执行这个函数,而这个函数是在全局做用域中执行的,因此在全局做用域中this指向的是当前对象天然就是全局变量(window),而咱们这个book变量最终做用是要获得Book这个类的执行结果,因为函数没有return语句,这个Book函数天然不会告诉book变量的执行结果了,因此book为undefined对象
var Book = function (id, name, price) { this.id = id; this.name = name; this.price = price; } var book = Book('12', 'js', 30); console.log(book);//undefined console.log(window.name);//'js'
安全模式blog
var Book = function (id, name, price) { if (this instanceof Book) { this.id = id; this.name = name; this.price = price; } else { new Book(id, name, price); } } var book = Book('12', 'js', 30); console.log(book);//Book console.log(book.name);//'js' console.log(window.name);//undefined