-
Notifications
You must be signed in to change notification settings - Fork 732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Javascript面向对象编程 #32
Labels
Comments
😢 |
上面HelloWscats()构造函数中的getPrivate方法,当我们每一次实例化的时候 this.getPrivate = function() {
console.log(privateVvariables);
} 原型对象最大特点是,所有对象实例共享它所包含的属性和方法,也就是说,所有在原型对象中创建的属性或方法都直接被所有对象实例共享 |
nice 半脸懵逼 |
getPrivate在原型对象里面怎么访问你在构造函数里定义的privateVvariables? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
JS面向对象的程序设计,JS在很早以前一直被认为毫无章法的语言,大部分初学者写的时候都是运用面向过程的思维来编写JS的(一页下来就是一个function接着另一个function的写法)
其实JS中function就是一个对象,如下面的代码
此时我们就可以调用_init 方法后打印
wscats is not cat
,它调用了HelloWscats的对象,当然这个HelloWscats对象没有任何属性和方法,它只有一个构造方法HelloWscats(),相当于调用了一个没有任何属性的方法和的类,当使用new进行创建的时候,就调用了它的构造方法(也就是执行了HelloWscats里面的console.log("wscats is not cat");
),当然现在很多JS的对象直接是定义了属性而已,而构造方法里面是没有其他可执行的代码的其实HelloWscats 就是我们所说的创建对象中的其中一种构造函数模式,
我们稍微改一下,执行_init2函数的时候,相当于创建对象中的另一种我们说的工厂模式,创建对象交给一个工厂方法(_init2)来实现,可以传递参数,这里创建对象的方式跟构造函数方式的区别在于
构造函数能看到具体的定义对象类型HelloWscats,而工厂模式不能,因为工厂模式创建对象都是使用Object的原生构造函数来完成的,如图
本质是这两句结果的区别
再写一个简单的例子来说明他们的区别,如下
上面就是一个最简单的对象,不过既然是对象,肯定是要赋予它属性和方法的
我们可以用prototype这个原型的关键字进行赋值,比如我们要给HelloWscats对象增加一个name属性和say方法,那我们就可以这样添加
这里我们看到了先是执行了构造函数中的
console.log("wscats is not cat");
,然后在执行原型链中的console.log("Wscats is not cat");
打开浏览器看看打印的obj对象具体是怎么样的
上面有一定注意的是,如果我实例化了HelloWscats对象
我们可以改变,这个对象的action属性
obj.action = "b";
,但我们没办法改变原型链的对象,这个就类似于继承了HelloWscats对象的原型链的对象,继承的这些子类无法更改,但是子类可以修改自己本身的属性和方法下面我可以继续在构造函数里面写一个
var privateVvariables = "I am ur cat";
来让HelloWscats拥有一个私有成员变量,当然这个变量也只有该对象的方法能访问,具体就是this.getPrivate函数能读到该私有变量的成员它的巧妙之处其实在于这个构造函数的作用域,只能在类的构造函数里面进行访问该私有变量
上面我们一直用
obj.name = "wscats"
或者obj = {name: "wscats"}
这两种方法来编辑或者定义obj的属性,那么有没有其他更好的方法呢,答案是有的,正如上面的这一段代码defineProperty方法能修改对象的属性它接收三个参数:属性所在对象,属性名和一个描述符对象(必须是:configurable、enumberable、writable和value,可设置一个或多个值)
他可以设置以下的数据属性(他们默认都为true),这四个数据属性也是对象属性的默认四个数据属性:
正如我写obj的name属性
configurable: false,writable: false,
后删除该对象的name属性值和修改name属性值也变得无效
The text was updated successfully, but these errors were encountered: